2008-12-03 7 views
4

Est-il possible de fusionner des éléments à l'aide de XSLT.Fusionner des nœuds XML à l'aide de XSLT

Si je le code XML suivant

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

Je veux la sortie suivante:

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

Mais je n'ai absolument aucune idée si cela est possible en utilisant XSLT

Répondre

8

Cette transformation:

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

lorsqu'il est appliqué sur le document XML fourni:

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

produit le résultat recherché:

 
<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

Vous devez utiliser la balises d'élément et d'attribut ...

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

... quant à l'algorithme pour déterminer ce que $ theLeft et $ theRight devraient être, je vous laisse cela.

Questions connexes