2016-05-23 6 views
0

Gibt es eine Möglichkeit, ein Element <list_x> abhängig von der Position bestimmter Knoten auf der preceding-sibling-Achse zu behandeln?XSLT: Prozesselement abhängig von der Position des vorhergehenden Geschwisters

XML-Code:

<?xml version="1.0" encoding="UTF-8"?> 
    <root> 
     <text/> 
     <text/> 
     <text/> 
     <list_num_start/> 
     <list_num/> 
     <list_num/> 
     <list_x/> 
     <text/> 
     <text/> 
     <text/> 
     <list_square_start/> 
     <list_square/> 
     <list_square/> 
     <list_x/> 
    </root> 

Vorlage:

<xsl:template match="list_x"> 
    <xsl:element name="li"> 
     <xsl:attribute name="class"><xsl:value-of select="name()"/></xsl:attribute> 
     <xsl:apply-templates/> 
    </xsl:element> 
    <xsl:choose> 
     <xsl:when test="position(preceding-sibling::list_num_start[last()]) &lt; position(preceding-sibling::list_square_start[last()])"> 
      <xsl:text disable-output-escaping="yes">&lt;/ol&gt;</xsl:text> 
     </xsl:when> 
     <xsl:otherwise>...</xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

Leider position() erlaubt keine Argumente.

Ausgang sollte sein:

<root> 
    <text/> 
    <text/> 
    <text/> 
    <ol> 
     <li class="list_num_start"/> 
     <li class="list_num"/> 
     <li class="list_num"/> 
     <li class="list_x"/> 
    </ol> 
    <text/> 
    <text/> 
    <text/> 
    <ul> 
     <li class="list_square_start"/> 
     <li class="list_square"/> 
     <li class="list_square"/> 
     <li class="list_x"/> 
    </ul> 
</root> 

Dank!

+0

Was ist Ihre gewünschte Ausgabe? – zx485

+0

Die von Ihnen angezeigte Ausgabe ist kein wohlgeformtes XML und kann nicht durch XSL-Umwandlung erstellt werden. - Bitte erläutern Sie im Klartext die Logik, die Sie hier anwenden möchten. Ein nicht funktionierender Code ist kein Ersatz für eine Erklärung. –

+0

wurde der Code als ein Beispiel betrachtet. Die Frage ist, wie man Elemente verarbeitet, die von bestimmten vorhergehenden Elementen auf den 'vorhergehenden Geschwister'-Achsen abhängen. – Ferestes

Antwort

1

können Sie versuchen:

<xsl:when test="count(preceding-sibling::list_num_start[1]/preceding-sibling::*) &lt; 
      count(preceding-sibling::list_square_start[1]/preceding-sibling::*)"> 

Dies gilt das Element vor dem für Sie suchen.

Ich habe list_num_start[last()] zu list_num_start[1] geändert, weil ich nehme an, dass Sie nach dem Element list_num_start direkt vor dem aktuellen suchen.

+0

Das funktioniert gut. Vielen Dank! – Ferestes

Verwandte Themen