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.

Foi útil?

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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top