XSLT匹配元素和填充

时间:2014-02-25 13:50:12

标签: xml xslt xslt-1.0

我需要将一个节点中的元素与另一个节点中的元素匹配,并将该另一个元素拉入生成的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”的数量也会变化。

1 个答案:

答案 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文档。