我需要将一个节点中的元素与另一个节点中的元素匹配,并将该另一个元素拉入生成的XML中。这是我的来源:
<Nodes>
<Metadata>
<ItemDefinition id="123456" name="Box 1" />
<ItemDefinition id="234567" name="Box 2" />
<ItemDefinition id="345678" name="Box 3" />
</Metadata>
<Node>
<Item id="123456" type="1">Test</Item>
<Item id="234567" type="4">Green</Item>
</Node>
<Node>
<Item id="123456" type="1">Test 2</Item>
<Item id="234567" type="4">Yellow</Item>
<Item id="345678" type="4">Red</Item>
</Node>
</Nodes>
这是我想要的输出:
<Node>
<Name>Box 2</Name>
<Name>Green</Name>
</Node>
<Node>
<Name>Box 2</Name>
<Name>Yellow</Name>
</Node>
<Node>
<Name>Box 3</Name>
<Name>Red</Name>
</Node>
所以我试图将每个Item的“id”元素与“type”为4匹配,然后将该字段的名称拉回到各个节点中。将始终存在Metadata节点,但之后“节点”的数量将变化,“Item”和“ItemDefinition”的数量也会变化。
答案 0 :(得分:2)
使用键:
可以最好地解决此类问题<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:key name="meta" match="ItemDefinition" use="@id" />
<xsl:template match="/">
<output>
<xsl:for-each select="Nodes/Node/Item[@type=4]">
<Node>
<Name><xsl:value-of select="key('meta', @id)/@name"/></Name>
<Name><xsl:value-of select="."/></Name>
</Node>
</xsl:for-each>
</output>
</xsl:template>
</xsl:stylesheet>
请注意,我已在结果中添加了根<output>
元素,否则它将不是格式良好的XML文档。