2010-08-13 6 views
3

je le code XML suivant et que vous souhaitez insérer xml supplémentaire dans ce:Ajout de noeuds XML à un point spécifique en utilisant xslt

<root> 
    <steps> 
     <step name="step1" type="process"> 
      <steps> 
       <step name="substep1"> 
       </step> 
      </steps> 
     </step> 
     <step name="step2" type="process"> 
      <steps> 
       <step name="substep1"> 
       <!-- more substeps...--> 
       </step> 
      </steps> 
     </step> 
     <step name="step3" type="process"> 
      <steps> 
       <step name="substep1"> 
       </step> 
       <step name="substep2"> 
       </step> 
       <!-- more substeps...--> 
      </steps> 
     </step> 
     <!-- THE BELOW IS WHAT I WISH TO ADD... and it has to be here --> 
     <step name="reference"> 
      <!-- These stuff have been hardcoded in my xsl so its fine --> 
     </step> 
     <!-- ends --> 
    </steps> 
    <references> 
     <reference name="reference1"> 
     </reference> 
     . 
     . 
     . 
    </references> 
</root> 

Comme je l'ai écrit dans l'échantillon xml, je souhaite ajouter une étape supplémentaire élément comme la toute dernière étape dans la plupart des étapes outter. J'ai l'extrait xml déjà codé en dur dans mon xsl donc tout ce que je devais faire est de trouver la meilleure logique pour passer à ce point particulier de l'arbre xml afin que je puisse appeler le modèle et ajouter ce snipet.

est l'approche recommandée/la meilleure pour le faire?

Merci.

+0

Bonne question (+1). Voir ma réponse pour une solution complète et simple - expliquée en détails. :) –

Répondre

6

Cette transformation:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
exclude-result-prefixes="xsl"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:param name="pAddition"> 
    <step name="reference"> 
    <XXX/> 
    </step> 
</xsl:param> 

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

<xsl:template match="/*/steps/step[position()=last()]"> 
    <xsl:call-template name="identity"/> 
    <xsl:copy-of select="$pAddition"/> 
</xsl:template> 
</xsl:stylesheet> 

lorsqu'il est appliqué sur ce document XML:

<root> 
    <steps> 
     <step name="step1" type="process"> 
      <steps> 
       <step name="substep1"> 
       </step> 
      </steps> 
     </step> 
     <step name="step2" type="process"> 
      <steps> 
       <step name="substep1"> 
       <!-- more substeps...--> 
       </step> 
      </steps> 
     </step> 
     <step name="step3" type="process"> 
      <steps> 
       <step name="substep1"> 
       </step> 
       <step name="substep2"> 
       </step> 
       <!-- more substeps...--> 
      </steps> 
     </step> 
    </steps> 
    <references> 
     <reference name="reference1"> 
     </reference> 
     . 
     . 
     . 
    </references> 
</root> 

produit le résultat souhaité, correct:

<root> 
    <steps> 
     <step name="step1" type="process"> 
     <steps> 
      <step name="substep1"/> 
     </steps> 
     </step> 
     <step name="step2" type="process"> 
     <steps> 
      <step name="substep1"><!-- more substeps...--></step> 
     </steps> 
     </step> 
     <step name="step3" type="process"> 
     <steps> 
      <step name="substep1"/> 
      <step name="substep2"/><!-- more substeps...--> 
     </steps> 
     </step> 
     <step name="reference"> 
     <XXX/> 
     </step> 
    </steps> 
    <references> 
     <reference name="reference1"/> 
     . 
     . 
     . 
    </references> 
</root> 

Prenez note:

  1. ** La règle d'identité permet de copier tous les noeuds comme il est. Le fragment XML à insérer est spécifié (pour plus de commodité) comme le corps d'un xsl:param global. Dans une application réaliste, il sera dans un fichier XML distinct et sera obtenu en utilisant la fonction xslt document().

  2. Le modèle qui correspond au point d'insertion copie le noeud correspondant en appelant la règle d'identité. alors il copie le contenu du xsl:param et ainsi le nouveau conted est sorti exactement au point d'insertion désiré.

+0

+1 Bonne réponse. C'est comme ça que je ferais. Mais je pense qu'il serait plus facile de simplement copier le RTF param. –

+0

@Alejandro: Hey, où est le +1 :)? Quant à la copie littérale - oui, mais vous et moi savons bien que nous appliquons des modèles pour obtenir la flexibilité - demain quelqu'un peut demander à faire un certain traitement sur le contenu des paramètres, aussi. –

+0

@Alejandro: En fait, vous aviez raison. J'ai beaucoup simplifié la transformation - voir les modifications. –

Questions connexes