xslt select 一个节点值基于另一个节点的值

xslt select a node value based on the value of another node

我的任务是使用 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>

我需要做的是从 //material/name 中获取名称 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 结果。

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

谢谢

变化:

<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 文档。请尽可能避免使用 // 来加快速度。

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

结果总是 "CONCENTRATE" 因为

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

returns 与 select 表达式匹配的集合的 first 节点的值。

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"/>

检索对应的名称。