2010-10-01 6 views
0

Comment puis-je convertir ce XMLConvertir arbre XML dans la liste des noeuds plat utilisant XSL

<albums> 
    <album title="New Zealand"> 
     <album title="Auckland"> 
      <image title="Mt Eden railroad station"/> 
      <image title="Morgan St"/> 
     </album> 
    </album> 
    <album title="Russia"> 
     <image title="Capital of Siberia"/> 
    </album> 
</albums> 

dans cette

<div class="level-0"> 
    New Zealand 
    Russia 
</div> 

<div class="level-1"> 
    Auckland 
</div> 

<div class="level-1"> 
    <img alt="Capital of Siberia"/> 
</div> 

<div class="level-2"> 
    <img alt="Mt Eden railroad station"/> 
    <img alt="Morgan St"/> 
</div> 

?

Répondre

1
<xsl:template match="/"> 
    <xsl:apply-templates select="/albums | //album"/> 
</xsl:template> 

<xsl:template match="albums | album"> 
    <div class="level-{count(ancestor-or-self::album)}"> 
    <xsl:apply-templates select="album/@title | image"/> 
    </div> 
</xsl:template> 

<xsl:template match="album/@title"> 
    <xsl:value-of select="concat(.,'&#xA;')"/> 
</xsl:template> 

<xsl:template match="image"> 
    <img alt="{@title}"/> 
</xsl:template> 
+1

Nick, cela ne fonctionne pas; 'xsl: value-of' ne peut pas être un enfant de l'élément' xsl: apply-templates'. – Flynn1179

+0

@ Flynn1179: Désolé devrait être réparé maintenant. –

+2

Si la commande est pertinente, vous pouvez ajouter '' à l'appel 'xsl: apply-templates' dans le premier modèle. – Flynn1179

3

Il est difficile de dire exactement ce que vous essayez de faire de cet échantillon, mais en général, vous pouvez aplatir un arbre XML avec une légère modification au modèle d'identité:

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

Vous pouvez probablement adapter cela à vos besoins spécifiques.

+0

+1 pour une bonne réponse. –

+0

+1 Parce que si l'ordre n'est pas pertinent c'est une meilleure réponse. –

Questions connexes