Como loop com XSLT através de nós hierárquicos?
Pergunta
Eu estou tentando atravessar nós seção Docbook. Sua estrutura são os seguintes:
<sect1>
<sect2>
<sect3>
<sect4>
<sect5>
</sect5>
</sect4>
</sect3>
</sect2>
</sect1>
Assim sect1 só tem dentro sect2, sect2 só terá dentro sect3, e assim por diante. Nós também pode ter vários nós sub dentro de um nó; por exemplo sect2 múltiplos dentro de uma sect1.
Programatically eu iterar através deles de forma recursiva usando um contador para manter o controle de qual seção do loop está.
Desta vez eu tenho que usar XSLT e para fazer um loop através dele. Assim, há uma maneira equivalente, ou melhor maneira de fazer isso em XSLT?
Edit: Eu já tenho código semelhante como sugerido por Willie, onde eu especificar cada nó seita (sect1 para sect5). Estou à procura de solução onde ele faz um loop determinar o nó seita, por si só, e eu não terão de código de repetição. Estou ciente de que Docbook especificações só permite até 5 nós aninhados.
Solução
Se você está fazendo a mesma processamento para todos seita {x} nós, regardles de {x}, como você diz em um dos comentários, então o seguinte é 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>
Se você realmente precisa para processo da mesma forma muitos mais elementos com diferentes nomes no formato "seita" {x} (digamos x está no intervalo [1, 100]), então o seguinte pode ser usado:
<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>
Outras dicas
<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>