¿Cómo recorrer XSLT a través de nodos jerárquicos?
Pregunta
Estoy tratando de atravesar los nodos de sección de Docbook. Su estructura es la siguiente:
<sect1>
<sect2>
<sect3>
<sect4>
<sect5>
</sect5>
</sect4>
</sect3>
</sect2>
</sect1>
Entonces sect1 solo tiene sect2 adentro, sect2 solo tendrá sect3 adentro, y así sucesivamente. También podemos tener múltiples subnodos dentro de un nodo; por ejemplo, sect2 múltiple dentro de una sect1.
Programáticamente iteraría a través de ellos de forma recursiva utilizando un contador para realizar un seguimiento de en qué sección se encuentra el bucle.
Esta vez tengo que usar XSLT y recorrerlo. Entonces, ¿hay una forma equivalente o una mejor manera de hacerlo en XSLT?
Editar: ya tengo un código similar al sugerido por Willie, donde especifico cada nodo de secta (sect1 a sect5). Estoy buscando una solución donde se repita determinando el nodo de secta por sí mismo, y no tendré que repetir el código. Soy consciente de que las especificaciones de Docbook solo permiten hasta 5 nodos anidados.
Solución
Si está realizando el mismo procesamiento para todos los nodos de la secta {x}, independientemente de {x}, como dice en uno de los comentarios, entonces lo siguiente es suficiente :
<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 realmente necesita procesar de la misma manera muchos más elementos que tienen diferentes nombres de la forma "secta" {x} (digamos que x está en el rango [1, 100]), entonces se puede usar lo siguiente :
<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>
Otros consejos
<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>