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.

¿Fue útil?

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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top