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.

Était-ce utile?

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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top