2011-08-15 2 views
0

Je dois troble avec un XML j'ai besoin de transformer woth xslt.Récupérer des informations dans la balise précédente avec xslt

Voici mon XML

<Groups> 
      <term> 
       <Tag1>My system1</Tag1> 
       <Tag2>yes</Tag2> 
       <Tag3>new york</Tag3> 
      </term> 
      <term> 
       <Tag1/> 
       <Tag2>no</Tag2> 
       <Tag3>chicago</Tag3> 
      </term>  
      <term> 
       <Tag1>My system2</Tag1> 
       <Tag2>ok</Tag2> 
       <Tag3>paris</Tag3> 
      </term> 
      <term> 
       <Tag1/> 
       <Tag2>help</Tag2> 
       <Tag3>london</Tag3> 
      </term> 
      <term> 
       <Tag1/> 
       <Tag2>cancel</Tag2> 
       <Tag3>rome</Tag3> 
      </term> 
</Groups> 

Et voici ma sortie désirée.

<Groups> 
      <term> 
       <Tag1>My system1</Tag1> 
       <Tag2>yes</Tag2> 
       <Tag3>new york</Tag3> 
      </term> 
      <term> 
       <Tag1>My system1</Tag1> 
       <Tag2>no</Tag2> 
       <Tag3>chicago</Tag3> 
      </term> 
      <term> 
       <Tag1>My system2</Tag1> 
       <Tag2>ok</Tag2> 
       <Tag3>paris</Tag3> 
      </term> 
      <term> 
       <Tag1>My system2</Tag1> 
       <Tag2>help</Tag2> 
       <Tag3>london</Tag3> 
      </term> 
      <term> 
       <Tag1>My system2</Tag1> 
       <Tag2>cancel</Tag2> 
       <Tag3>rome</Tag3> 
      </term> 
</Groups> 

Tous les xslt doit faire est de remplir les balises vides avec la valeur des précédentes balises non vides.

J'ai essayé d'utiliser la variable, mais apparemment, ils ne fonctionnent pas comme variable dans les langages impératifs.

Un conseil sur la façon de faire?

Merci

Répondre

2

Cette feuille de style simple devrait le faire:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="*[not(text())]"> 
    <xsl:copy> 
     <xsl:value-of select="../preceding-sibling::*[*[text() and name()=name(current())]][1]/*[text() and name()=name(current())]" /> 
    </xsl:copy> 
    </xsl:template> 

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

l'exemple, ça aide beaucoup :) – Nicolas

1

Vous pouvez toujours utiliser l'axe « précédent » pour rechercher une étiquette correspondant que ne contiennent une valeur, par exemple preceding::Tag1[text()] [1]. (sélectionner le premier élément Tag1 qui a un enfant texte, le premier tel tag sera le tag précédent non vide car le sens de l'axe précédent est l'ordre inverse du document). Clair?

+0

Merci pour l'aide, souhaite que je pourrais upvote :(Ce – Nicolas

+0

est ok, je me incline à l'élégance de l'autre réponse et upvote qu'au lieu :) Merci pour –

Questions connexes