2014-02-25 88 views
1

我需要將一個節點中的元素與另一個節點中的元素進行匹配,並將其他元素拉入到我的結果XML中。下面是我的源:XSLT匹配元素和填充

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

所以我想以匹配「ID」元素爲每個項目有4個「型」和拉回來該字段的名稱分成單獨的節點。總是會有這個元數據節點,但之後的「節點」數量將會有所不同,「Item」和「ItemDefinition」的數量也會不同。

+0

究竟是什麼問題? – Cheesebaron

回答

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文件。