xslt根据另一个节点的值选择节点值

时间:2015-06-04 09:10:28

标签: xslt xslt-1.0

我的任务是使用XSLT创建一个csv文件来生成信息。到目前为止,我几乎拥有了我需要的所有东西,但是根据下面的例子,有一点我正在努力获得。

<issuesExport xmlns="http://www.mynamesapce.co.uk/import">
<materials>
<material>
  <code>WB821</code>
  <name>CONCENTRATE</name>
</material>
<material>
  <code>WB820</code>
  <name>ADDITIVE</name>
</material>
</materials>
<issues>
 <issue>
  <formulaCode>TEST</formulaCode>
  <materialBatch>
    <materialCode>WB821</materialCode>
    <batchNumber>sdfsd</batchNumber>
    <isManualAddBatch>false</isManualAddBatch>
    <isFinished>true</isFinished>
    <weight>0</weight>
    <cost>0</cost>
  </materialBatch>
  <issueBatchNumber>df34323</issueBatchNumber>
</issue>

我需要做的是从//材料/名称中获取名称,其中issue / materialBatch / materialCode = material / code。

我当前的XSLT看起来像这样

<xsl:if test="i:materialBatch/i:materialCode=//i:material/i:code">
  <xsl:value-of select="//i:materials/i:material/i:name"/>
</xsl:if>

总是评估为true并给出我的CONCENTRATE结果。

如果有人能告诉我哪里出错了,我将不胜感激

谢谢

2 个答案:

答案 0 :(得分:2)

您的测试始终返回true,因为您正在比较两个节点集 - 如果集合A中的一个节点与集合B中的节点匹配,则此类测试返回true。

结果总是&#34; CONCENTRATE&#34;因为

<xsl:value-of select="//i:materials/i:material/i:name"/>

返回与select表达式匹配的集合的第一个节点的值。

XSLT有build-in mechanism for looking up referenced values。要使用它,首先要在样式表的顶层定义一个键:

<xsl:key name="material-bycode" match="i:material" use="i:code" />  

然后,从issue的上下文中,您可以使用:

<xsl:value-of select="key('material-by-code', i:materialBatch/i:materialCode)/i:name"/>

检索相应的名称。

答案 1 :(得分:0)

变化:

<xsl:if test="i:materialBatch/i:materialCode=//i:material/i:code">
  <xsl:value-of select="//i:materials/i:material/i:name"/>
</xsl:if>

要:

<xsl:value-of select="/i:issuesExport/i:materials/i:material[i:code = i:materialBatch/i:materialCode]/i:name"/>

另请注意,//搜索完整的XML文档。请尽量避免使用//尽可能加快速度。