2010-09-08 5 views
0

Im travaillant avec PHP5, et je dois transformer XML sous la forme suivante:noeud copie attribue au nœud parent

<section> 
     <heading> 
      <line absolutePage="4" page="2" num="35">A Heading</line> 
     </heading> 
     <subsection type="type1"> 
      <heading label="3"> 
        <line absolutePage="4" page="2" num="36">A Subheading</line> 
      </heading> 
      <content/> 
     </subsection> 
</section> 

Dans quelque chose comme ceci:

<section name="A Heading"> 
     <heading> 
      <line absolutePage="4" page="2" num="35">A Heading</line> 
     </heading> 
     <subsection type="type1" label="3" name="A Subheading"> 
      <heading label="3"> 
        <line absolutePage="4" page="2" num="36">A Subheading</line> 
      </heading> 
      <content/> 
     </subsection> 
</section> 

Notez que l'attribut label a été copié de l'attribut heading vers l'élément parent.

Le texte de l'élément heading/line a également été ajouté en tant qu'attribut du nœud parent heading.

Répondre

3

Cette feuille de style:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="subsection"> 
     <subsection label="{heading/@label}" name="{heading/line}"> 
      <xsl:apply-templates select="@*|node()"/> 
     </subsection> 
    </xsl:template> 
    <xsl:template match="section"> 
     <section name="{heading/line}"> 
      <xsl:apply-templates select="@*|node()"/> 
     </section> 
    </xsl:template> 
</xsl:stylesheet> 

Sortie:

<section name="A Heading"> 
    <heading> 
     <line absolutePage="4" page="2" num="35">A Heading</line> 
    </heading> 
    <subsection label="3" name="A Subheading" type="type1"> 
     <heading label="3"> 
      <line absolutePage="4" page="2" num="36">A Subheading</line> 
     </heading> 
     <content></content> 
    </subsection> 
</section> 

Remarque: Chaque fois est d'utiliser des éléments posible de résultat littéral et attributs modèle de valeur, utilisez-le. Cela rend le code compact et rapide. Si vous voulez une réponse plus générale, clarifiez s'il vous plaît.

Modifier: Manqué section/@name. Bien sûr, si la chaîne vide section/@label ne vous dérange pas, vous pouvez utiliser le modèle section|subsection.

+0

@Alejandro, merci beaucoup, il suffit d'ajouter la correspondance OR pour 'section', qui manque. :) –

+0

@Benjamin Ortuzar: Vous êtes bienvenu. J'ai également mis à jour la réponse. –

+0

+1 pour utiliser et ignorer la transformation d'identité et pour utiliser les AVT –

Questions connexes