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.

È stato utile?

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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top