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"/>
检索对应的名称。
我的任务是使用 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"/>
检索对应的名称。