2010-06-11 7 views
3

Bonjour, est-ce que quelqu'un sait à quoi ressemblera le xsl pour transformer ce XML. Il peut y avoir N nte après pid et N nte après pv1. La structure est garantie en ce que tout ce qui suit pid appartient à pid et tout ce qui suit pv1 appartient à pv1.créer des nœuds enfants à partir de nœuds frères jusqu'à ce qu'un autre brassage se produise

De:

<pid> 
</pid> 
<nte> 
    <nte-1>1</nte-1> 
    <nte-3>Note 1</nte-1> 
</nte> 
<nte></nte> 
<pv1></pv1> 
<nte> 
</nte> 

dans:

<pid> 
    <nte> 
    <nte-1>1</nte-1> 
    <nte-3>Note 1</nte-1> 
    </nte> 
    <nte> 
    </nte> 
</pid> 
<pv1> 
    <nte> 
    </nte> 
</pv1> 

Merci!

+0

Bonne question (+1). Voyez ma réponse pour une solution courte et efficace. :) –

Répondre

3

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:strip-space elements="*"/> 

<xsl:key name="kLogicalChildren" match="nte" 
    use="generate-id(preceding-sibling::* 
         [self::pid or self::pv1] 
         [1])"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="pid|pv1"> 
    <xsl:copy> 
    <xsl:copy-of select="@*"/> 

    <xsl:copy-of select= 
    "key('kLogicalChildren', generate-id())"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="nte"/> 
</xsl:stylesheet> 

lorsqu'il est appliqué sur le document XML fourni (corrigé pour être bien formé):

<t> 
    <pid></pid> 
    <nte> 
     <nte-1>1</nte-1> 
     <nte-3>Note 1</nte-3> 
    </nte> 
    <nte></nte> 
    <pv1></pv1> 
    <nte></nte> 
</t> 

produit le résultat souhaité, corriger:

<t> 
    <pid> 
     <nte> 
      <nte-1>1</nte-1> 
      <nte-3>Note 1</nte-3> 
     </nte> 
     <nte/> 
    </pid> 
    <pv1> 
     <nte/> 
    </pv1> 
</t> 
+0

Fonctionne comme un charme! Merci! – user364939

Questions connexes