不允许包含多个项目的序列作为concat()的第二个参数

时间:2015-01-15 15:44:31

标签: xslt concat

如果我没有引入" other_location_postal_code"以下xsl可以正常工作。字段,在这里评论。

这是因为如果我引入该字段,会有多条记录。

我怎样才能让这个xsl评估每条记录,这样它就会写两次这个记录,一次是针对一个"其他位置的邮政编码"和另一个?

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:e="http://www.taleo.com/ws/tee800/2009/01" xmlns:fct="http://www.taleo.com/xsl_functions" exclude-result-prefixes="e fct">
  <xsl:output method="xml" encoding="UTF-8" omit-xml-declaration="no"/>
  <xsl:param name="OUTBOUND_FOLDER"/>
  <xsl:template match="/">
    <source>
      <xsl:apply-templates select="//e:Requisition"/>
    </source>
  </xsl:template>
  <xsl:template match="e:Requisition">
    <xsl:variable name="job_id" select="e:ContestNumber"/>
    <xsl:variable name="other_location_postal_code" select="e:JobInformation/e:JobInformation/e:OtherLocations/e:Location/e:NetworkLocation/e:NetworkLocation/e:ZipCode"/>
    <job>
      <job_id>
        <xsl:value-of select="concat('&lt;','![CDATA[',$job_id,']]','&gt;')"/>
      </job_id>
      <other_location_postal_code>
        <xsl:value-of select="concat('![CDATA[',$other_location_postal_code,']]')"/>
      </other_location_postal_code>
      </job>
      </xsl:template>
      </xsl:stylesheet>

我希望它像这样出来:

<?xml version="1.0" encoding="UTF-8"?>
<source>
<job>
<job_id><![CDATA[15000005]]></job_id>
<other_location_postal_code><![CDATA[77382]]></other_location_postal_code>
</job>
<job>
<job_id><![CDATA[15000005]]></job_id>
<other_location_postal_code><![CDATA[37567]]></other_location_postal_code>
</job>
</source>

初始XML看起来像这样:

    <?xml version="1.0" encoding="UTF-8"?>

    -<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   -<soapenv:Body>
   -<ns1:getDocumentByKeyResponse xmlns:ns1="http://www.taleo.com/ws/integration/toolkit/2005/07" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
   -<Document xmlns="http://www.taleo.com/ws/integration/toolkit/2005/07">
   -<Attributes>
    <Attribute name="count">1</Attribute>
    <Attribute name="duration">0:00:00.088</Attribute>
    <Attribute name="entity">Requisition</Attribute>
    <Attribute name="mode">T-XML</Attribute>
    <Attribute name="version">http://www.taleo.com/ws/tee800/2009/01</Attribute>
    </Attributes>
    -<Content>
   -<ExportTXML xmlns="http://www.taleo.com/ws/integration/toolkit/2005/07" xmlns:e="http://www.taleo.com/ws/tee800/2009/01">
   -<e:Requisition>
    <e:ContestNumber>15000005</e:ContestNumber>
    -<e:JobInformation>
   -<e:JobInformation>
   -<e:OtherLocations>
   -<e:Location>
    <e:ZipCode>77002</e:ZipCode>
    </e:Location>
   -<e:Location>
    <e:ZipCode>77050</e:ZipCode>
    </e:Location>
    </e:OtherLocations>
    </e:JobInformation>
    </e:JobInformation>
    </e:Requisition>
    </ExportTXML>
    </Content>
    </Document>
    </ns1:getDocumentByKeyResponse>
    </soapenv:Body>
    </soapenv:Envelope>

1 个答案:

答案 0 :(得分:1)

错误消息只是说concat函数的参数是多个节点的序列。因此,您的一些变量会选择两个或多个节点,而concat期望它的每个参数都是单个节点。您需要确定要输出的内容,或者只有$var[1]的第一个节点或string-join($var, ' ')的连接。

请注意,您不需要所有这些尝试输出CDATA部分,您可以告诉XSLT处理器cdata-section-elements方向上的xsl:output

正如您现在发布的更多详细信息一样,建议将每个ZipCode元素映射到job元素:

<xsl:stylesheet
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:e="http://www.taleo.com/ws/tee800/2009/01"
  exclude-result-prefixes="e">

<xsl:output indent="yes" cdata-section-elements="job_id other_location_postal_code"/>

<xsl:template match="/">
  <source>
    <xsl:apply-templates select="//e:OtherLocations/e:Location/e:ZipCode"/>
  </source>
</xsl:template>

<xsl:template match="e:ZipCode">
  <xsl:apply-templates select="ancestor::e:Requisition">
    <xsl:with-param name="zc" select="current()"/>
  </xsl:apply-templates>
</xsl:template>

<xsl:template match="e:Requisition">
  <xsl:param name="zc"/>
  <job>
    <job_id><xsl:value-of select="e:ContestNumber"/></job_id>
    <other_location_postal_code><xsl:value-of select="$zc"/></other_location_postal_code>
  </job>
</xsl:template>

</xsl:stylesheet>