2009-03-18 17 views
3

Ich versuche, Docbook Abschnitt Knoten zu durchlaufen. Ihre Struktur ist wie folgt:Wie Schleife mit XSLT über hierarchische Knoten?

<sect1> 
    <sect2> 
     <sect3> 
     <sect4> 
      <sect5> 
      </sect5> 
     </sect4> 
     </sect3> 
    </sect2> 
</sect1> 

So sect1 haben nur innerhalb sect2 wird sect2 nur hat innerhalb sect3, und so weiter. Wir können auch mehrere Unterknoten innerhalb eines Knotens haben; zum Beispiel multiple sect2 innerhalb einer sect1.

Programmatisch würde ich sie rekursiv durchlaufen mit einem Zähler für die Verfolgung von welchem ​​Abschnitt die Schleife ist.

Dieses Mal muss ich XSLT verwenden und durchschleifen. Gibt es also einen gleichwertigen oder besseren Weg, dies in XSLT zu tun?

Edit: Ich habe bereits ähnlichen Code wie von Willie vorgeschlagen, wo ich jeden Abschnitt Knoten (sect1 bis sect5) angeben. Ich suche nach einer Lösung, bei der es den Sektenknoten selbst bestimmt, und ich muss den Code nicht wiederholen. Mir ist bewusst, dass Docbook-Spezifikationen nur bis zu 5 verschachtelte Knoten erlauben.

Antwort

4

Wenn Sie die gleiche Verarbeitung für alle Sekte {x} Knoten tun, regardles von {x}, wie Sie in einer der Kommentare sagen, dann ist die folgende ausreichend:

<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> 

Wenn Sie wirklich mehr Elemente mit unterschiedlichen Namen der Form "sect" {x} verarbeiten müssen (nehmen wir an, dass x im Bereich [1, 100] liegt), dann kann Folgendes verwendet werden:

<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> 
0
<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> 
+0

Danke für die Antwort Willie. Ich habe etwas ähnliches, wo ich Code für jeden Abschnitt schreiben muss (Abschnitt 1 bis Abschnitt 5). Ich weiß, dass Docbook-Spezifikationen nur 5 Sektenknoten erlauben, aber ich suchte nach etwas, wo ich die Sektionsnummer im Handumdrehen definieren kann. – Marcel

+0

Ich verstehe. Hm, nicht sicher aus der Hand. Vernünftige Köpfe werden sich hier wahrscheinlich unterscheiden, aber ich selbst würde nicht den Ansatz nehmen, die Abschnittsnummer dynamisch zu definieren, weil die fünf Elemente nicht wirklich "gleich" sind. Was machst du in den Vorlagen? Ist es für jeden Abschnitt gleich? –

+0

Wenn die Vorlage im Wesentlichen die gleichen sind, könnten Sie jede sect_ Vorlage die gleiche benannte Vorlage aufrufen ... –