2010-08-12 6 views
2

Compte tenu du document XML suivant:Comment créer une table des matières avec tous les niveaux de hiérarchie?

<Include> 
    <Feature Title="A"> 
    <Feature Title="1" /> 
    <Feature Title="2" /> 
    </Feature> 
    <Feature Title="B"> 
    <Feature Title="3"> 
     <Feature Title="i" /> 
     <Feature Title="ii" /> 
    </Feature> 
    <Feature Title="4" /> 
    </Feature> 
</Include> 

J'ai besoin de générer un fichier texte qui ressemble à:

; Header 

A 
A/1 
A/2 
B 
B/3 
B/3/i 
B/3/ii 
B/4 

Ma meilleure tentative de parvenir est la feuille de style XSL:

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

    <xsl:template match="/"> 
    <xsl:text>; Header&#x0A;&#x0D;&#x0A;&#x0D;</xsl:text> 
    <xsl:apply-templates select="//Feature" /></xsl:template> 

    <xsl:template match="Feature"> 
    <xsl:value-of select="@Title" /><xsl:text>&#x0A;&#x0D;</xsl:text> 
    </xsl:template> 
</xsl:stylesheet> 

Mais cela génère la sortie:

; Header 

A 
1 
2 
B 
3 
i 
ii 
4 

Comment puis-je obtenir tous les niveaux de hiérarchie dans la sortie?

Répondre

10

Cette feuille de style:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
    <xsl:template match="Include"> 
     <xsl:text>; Header&#xA;&#xA;</xsl:text> 
     <xsl:apply-templates/> 
    </xsl:template> 
    <xsl:template match="Feature"> 
     <xsl:param name="pPrevious" select="''"/> 
     <xsl:value-of select="concat($pPrevious,@Title,'&#xA;')"/> 
     <xsl:apply-templates> 
      <xsl:with-param name="pPrevious" select="concat($pPrevious,@Title,'/')"/> 
     </xsl:apply-templates> 
    </xsl:template> 
</xsl:stylesheet> 

Sortie:

; Header 

A 
A/1 
A/2 
B 
B/3 
B/3/i 
B/3/ii 
B/4 

Juste pour le plaisir, une ligne XPath 2.0:

concat('; Header&#xA;&#xA;', 
     string-join(/Include//Feature/string-join(
      ancestor-or-self::Feature/@Title,'/'), 
      '&#xA;') 
    ) 
+0

Bonne solution - 1 –

+0

Parfait! Merci pour la solution. –

+0

@Brian Bassett: Vous êtes bienvenu! Je suis content que ce fut utile. –

Questions connexes