2008-12-03 122 views
4

是否可以使用XSLT合併元素。使用XSLT合併XML節點

如果我有下面的XML

<data> 
<item column="left" value="1" /> 
<item column="left" value="2" /> 
<item column="right" value="3" /> 
<item column="left" value="4" /> 
<item column="right" value="5" /> 
<item column="right" value="6" /> 
<item column="right" value="7" /> 
<item column="left" value="8" /> 
<item column="right" value="9" /> 
<item column="right" value="10" /> 
</data> 

我想下面的輸出:

<data> 
<item left="1" right="3 /> 
<item left="2" right="5" /> 
<item left="4" right="6" /> 
<item left="8" right="7" /> 
<item left="" right="9" /> 
<item left="" right="10" /> 
</data> 

但我完全不知道,如果這個使用XSLT

回答

8

這種變換:

 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

    <xsl:template match="data"> 
     <xsl:variable name="vNumLeft" select="count(item[@column='left'])"/> 

     <data> 
     <xsl:apply-templates select="*[@column='left']"/> 
     <xsl:apply-templates select= 
       "*[@column='right'][position() > $vNumLeft]"/> 
     </data> 
    </xsl:template> 

    <xsl:template match="item[@column='left']"> 
     <xsl:variable name="vPos" select="position()"/> 

     <item left="{@value}" 
        right="{../item[@column='right'][$vPos]/@value}" /> 
    </xsl:template> 

    <xsl:template match="item[@column='right']"> 
     <item left="" right="{@value}" /> 
    </xsl:template> 
</xsl:stylesheet> 

時所提供的XML文檔應用:

 
<data> 
    <item column="left" value="1" /> 
    <item column="left" value="2" /> 
    <item column="right" value="3" /> 
    <item column="left" value="4" /> 
    <item column="right" value="5" /> 
    <item column="right" value="6" /> 
    <item column="right" value="7" /> 
    <item column="left" value="8" /> 
    <item column="right" value="9" /> 
    <item column="right" value="10" /> 
</data> 

產生想要的結果:

 
<data> 
    <item left="1" right="3"/> 
    <item left="2" right="5"/> 
    <item left="4" right="6"/> 
    <item left="8" right="7"/> 
    <item left="" right="9"/> 
    <item left="" right="10"/> 
</data> 
-3

你會使用是可能的元素和屬性標籤...

<xsl:element name="item"> 
    <xsl:attribute name="left"><xsl:value-of select="$theLeft"/></xsl:attribute> 
    <xsl:attribute name="right"><xsl:value-of select="$theRight"/></xsl:attribute> 
</xsl:element> 

...至於確定$ theLeft和$ theRight應該是什麼的算法,我把它留給你。