2009-03-18 10 views
3

J'essaie de traverser des nœuds de section Docbook. Leur structure sont les suivantes:Comment faire une boucle avec XSLT via des nœuds hiérarchiques?

<sect1> 
    <sect2> 
     <sect3> 
     <sect4> 
      <sect5> 
      </sect5> 
     </sect4> 
     </sect3> 
    </sect2> 
</sect1> 

Alors sect1 ne sont sect2 à l'intérieur, ne sect2 aura sect3 l'intérieur, et ainsi de suite. Nous pouvons également avoir plusieurs sous-nœuds dans un nœud; par exemple, plusieurs sect2 dans une sect1.

Programatically Je les parcourirais récursivement en utilisant un compteur pour garder la trace de la section de la boucle.

Cette fois, je dois utiliser XSLT et passer en boucle. Y a-t-il une manière équivalente, ou une meilleure façon de le faire dans XSLT? Editer: J'ai déjà un code similaire à celui proposé par Willie, où je spécifie chaque nœud de sectes (sect1 à sect5). Je cherche une solution où il boucle en déterminant le nœud de la section par lui-même, et je n'aurai pas à répéter le code. Je suis conscient que les spécifications DocBook ne permettent que jusqu'à 5 nœuds imbriqués.

Répondre

4

Si vous faites le même traitement à toutes les sectes {x} noeuds, regardles de {x}, comme vous le dites dans l'un des commentaires, alors ce qui suit est suffisante:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match= 
    "sect1|sect2|sect3|sect4|sect5"> 
     <!-- Some processing here --> 
     <xsl:apply-templates/> 
    </xsl:template> 
</xsl:stylesheet> 

Si vous avez vraiment besoin de traiter de la même manière beaucoup plus d'éléments ayant des noms différents de la forme "sect" {x} (disons que x est dans la plage [1, 100]), alors vous pouvez utiliser:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match= 
    "*[starts-with(name(), 'sect') 
     and 
     substring-after(name(), 'sect') >= 1 
     and 
     not(substring-after(name(), 'sect') > 101) 
     ]"> 
     <!-- Some processing here --> 
     <xsl:apply-templates/> 
    </xsl:template> 
</xsl:stylesheet> 
0
<xsl:template match="sect1"> 
    <!-- Do stuff --> 
    <xsl:apply-templates /> 
</xsl:template> 

<xsl:template match="sect2"> 
    <!-- Do stuff --> 
    <xsl:apply-templates /> 
</xsl:template> 

<xsl:template match="sect3"> 
    <!-- Do stuff --> 
    <xsl:apply-templates /> 
</xsl:template> 

<xsl:template match="sect4"> 
    <!-- Do stuff --> 
    <xsl:apply-templates /> 
</xsl:template> 

<xsl:template match="sect5"> 
    <!-- Do stuff --> 
    <xsl:apply-templates /> 
</xsl:template> 
+0

Merci pour la réponse Willie. J'ai quelque chose de similaire, où je dois écrire du code pour chaque section (sect1 à sect5). Je sais que les spécifications Docbook ne permettent que 5 nœuds de sectes, mais je cherchais quelque chose où je peux définir le numéro de section à la volée. – Marcel

+0

Je vois. Hm, pas sûr désinvolte. Les esprits raisonnables différeront probablement ici, mais moi-même je ne prendrais pas l'approche de la définition dynamique du numéro de section, car les cinq éléments ne sont pas vraiment «les mêmes». Que faites-vous à l'intérieur des modèles? Est-ce la même chose pour chaque section? –

+0

Si le modèle est essentiellement le même, vous pouvez avoir chaque modèle sect_ appel le même modèle nommé ... –

Questions connexes