Come eseguire il loop con XSLT attraverso nodi gerarchici?
Domanda
Sto cercando di attraversare i nodi della sezione Docbook. La loro struttura è la seguente:
<sect1>
<sect2>
<sect3>
<sect4>
<sect5>
</sect5>
</sect4>
</sect3>
</sect2>
</sect1>
Quindi sect1 ha solo sect2 all'interno, sect2 avrà solo sect3 all'interno e così via. Possiamo anche avere più sottonodi all'interno di un nodo; ad esempio, multiple sect2 all'interno di una sect1.
A livello di programmazione, li scorrerei in modo ricorsivo usando un contatore per tenere traccia di quale sezione si trova il ciclo.
Questa volta devo usare XSLT e collegarlo. Quindi esiste un modo equivalente o un modo migliore per farlo in XSLT?
Modifica: ho già un codice simile a quello suggerito da Willie, dove specifico ogni nodo di setta (da setta a setta5). Sto cercando una soluzione in cui il ciclo determina da solo il nodo setta e non dovrò ripetere il codice. Sono consapevole che le specifiche di Docbook consentono solo fino a 5 nodi nidificati.
Soluzione
Se stai eseguendo la stessa elaborazione su tutti i nodi di setta {x}, i saluti di {x}, come dici in uno dei commenti, allora è sufficiente :
<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 hai davvero bisogno di elaborare allo stesso modo molti più elementi con nomi diversi del modulo "setta" {x} (supponiamo che x sia nell'intervallo [1, 100]), è possibile utilizzare quanto segue :
<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>
Altri suggerimenti
<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>