Comment boucler avec XSLT via des nœuds hiérarchiques?
Question
J'essaie de traverser les nœuds de section Docbook. Leur structure est la suivante:
<sect1>
<sect2>
<sect3>
<sect4>
<sect5>
</sect5>
</sect4>
</sect3>
</sect2>
</sect1>
Donc, sect1 n'a que sect2 à l'intérieur, sect2 n'aura que 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.
Par programmation, je les parcourrais récursivement en utilisant un compteur pour garder trace de la section à laquelle se trouve la boucle.
Cette fois, je dois utiliser XSLT et le parcourir en boucle. Existe-t-il donc un moyen équivalent ou un meilleur moyen de le faire dans XSLT?
Edit: J'ai déjà un code similaire à celui suggéré par Willie, dans lequel je spécifie chaque nœud de secte (sect1 à sect5). Je cherche une solution qui permette de déterminer le nœud sect par lui-même, sans avoir à répéter le code. Je suis conscient que les spécifications de Docbook n'autorisent que 5 nœuds imbriqués.
La solution
Si vous effectuez le même traitement pour tous les nœuds de la {x} secte, à savoir {x}, comme indiqué dans l'un des commentaires, les informations suivantes suffisent :
<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]), vous pouvez utiliser les éléments suivants: :
<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>
Autres conseils
<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>