我的任务是使用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结果。
如果有人能告诉我哪里出错了,我将不胜感激
谢谢
答案 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文档。请尽量避免使用//
尽可能加快速度。