2010-06-21 5 views
1

Est-il possible de faire la transformation ci-dessous en utilisant XSL 1.0. Si oui, merci de poster un exemple de code qui peut me permettre de commencer dans la bonne direction.XSL 1.0 Transformation pour fusionner des nœuds

<Region> 
<RecType1><Amt> 100 </Amt></RecType1><RecType2><Name>XXX</Name></RecType2><RecType1><Amt> 200 </Amt></RecType1><RecType2><Name>YYY</Name></RecType2><RecType1><Amt> 300 </Amt></RecType1><RecType2><Name>ZZZ</Name></RecType2></Region> 

À

<Region> 
<Payment><Amt>100</Amt><Name>XXX</Name></Payment><Payment><Amt>200</Amt><Name>YYY</Name></Payment><Payment><Amt>300</Amt><Name>ZZZ</Name></Payment></Region> 
+0

Bonne question (1). Voir ma réponse pour une solution complète. –

Répondre

0

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="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="RecType1"> 
    <Payment> 
    <xsl:apply-templates select="* | following-sibling::RecType2[1]/*"/> 
    </Payment> 
</xsl:template> 

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

lorsqu'il est appliqué sur le document XML fourni (indenté à fait lisible):

<Region> 
    <RecType1> 
     <Amt> 100 </Amt> 
    </RecType1> 
    <RecType2> 
     <Name>XXX</Name> 
    </RecType2> 
    <RecType1> 
     <Amt> 200 </Amt> 
    </RecType1> 
    <RecType2> 
     <Name>YYY</Name> 
    </RecType2> 
    <RecType1> 
     <Amt> 300 </Amt> 
    </RecType1> 
    <RecType2> 
     <Name>ZZZ</Name> 
    </RecType2> 
</Region> 

produit le résultat souhaité (également en retrait pour être lisible):

<Region> 
    <Payment> 
     <Amt> 100 </Amt> 
     <Name>XXX</Name> 
    </Payment> 
    <Payment> 
     <Amt> 200 </Amt> 
     <Name>YYY</Name> 
    </Payment> 
    <Payment> 
     <Amt> 300 </Amt> 
     <Name>ZZZ</Name> 
    </Payment> 
</Region> 
Questions connexes