2009-07-15 11 views
2

Ich weiß, dass es die current() Funktion gibt, um den aktuellen Knoten in XSL abzurufen, aber gibt es eine Möglichkeit, die "vorherigen" und "nächsten" Knoten in Bezug auf die aktuelle Position?XSL (T) aktuell/vorheriges/nächstes

Antwort

4

Nein. Der aktuelle Kontext kann nicht wissen, welche Knoten "next" oder "previous" sind.

Dies liegt daran, wenn zum Beispiel Vorlagen angelegt werden, die Mechanik so gehen:

  1. Sie tun: <xsl:apply-templates select="*" /><!-- select 3 nodes (a,b,c) -->
  2. Der XSLT-Prozessor Liste der Knoten machen verarbeitet werden (a, b, c)
  3. Für jeden dieser Knoten, der XSLT-Prozessor wählt und führt eine passende schablone
  4. Wenn die Vorlage aufgerufen wird, wird der current() Knoten definiert ist, und position() definiert ist, aber anders als das die Vorlage keine k hat Kenntnis des Ausführungsflusses.
  5. Die Ausführungsreihenfolge hängt von den Präferenzen des Prozessors ab, solange das Ergebnis garantiert gleich ist. Ihre (theoretischen) Vorhersagen könnten für einen Prozessor wahr und falsch für einen anderen sein. Für eine nebenwirkungsfreie Programmiersprache wie XSLT wäre Wissen wie dieses eine gefährliche Sache, denke ich (weil Leute anfangen würden, sich auf die Ausführungsreihenfolge zu verlassen).

Sie können die following::sibling oder preceding::sibling XPath Achsen tun verwenden, aber das ist etwas anderes zu wissen, welche Knoten

EDIT

Die obige Erklärung die Frage zu beantworten versucht nächste verarbeitet werden, wie es war gefragt, aber das OP bedeutete etwas anderes. Es geht nur darum, eindeutige Knoten zu gruppieren/auszugeben.

Gemäß der Anfrage des OP, hier eine kurze Demonstration, wie man eine Gruppierung mit den XPath-Achsen erreicht.

XML (die Einzelteile sind vorsortiert):

<items> 
    <item type="a"></item> 
    <item type="a"></item> 
    <item type="a"></item> 
    <item type="a"></item> 
    <item type="b"></item> 
    <item type="e"></item> 
</items> 

XSLT

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> 

    <xsl:template match="/items"> 
    <!-- copy the root element --> 
    <xsl:copy> 
     <!-- select those items that differ from any of their predecessors --> 
     <xsl:apply-templates select=" 
     item[ 
      not(@type = preceding-sibling::item/@type) 
     ] 
     " /> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="item"> 
    <!-- copy the item to the output --> 
    <xsl:copy-of select="." /> 
    </xsl:template> 

</xsl:stylesheet> 

Ausgang:

<items> 
    <item type="a"></item> 
    <item type="b"></item> 
    <item type="e"></item> 
</items> 
+0

Wie in, verarbeite ich eine große sortierte Liste. Beispiel Ich möchte in der Lage zu sagen, ob das vorherige Element vom gleichen Typ war, so dass ich einige CSS ausführen kann, um sie zu "gruppieren". – James

+0

Dies geschieht am besten über die Gruppierung nach München, aber wenn die Liste der Einträge sortiert ist, können Sie mit '" // item [@type! = Previous-sibling :: item/@ type] "' – Tomalak

+0

fertig werden das in einen Arbeitscode schreiben? Ich kann es nicht zur Arbeit bringen. Also sag HEY, wenn das vorherige gleich ist? Vielen Dank! – James

1

Sie sprechen nächsten und vorherigen Knoten in der Dokumentstruktur Unter der Annahme, wie es auf den aktuellen Ausführungsablauf entgegengesetzt (wie ein for-each loop), siehe die preceding-sibling und following-sibling Achsen: XPath Axes on W3.

an den nächsten Knoten mit dem gleichen Namen zu erhalten:

following-sibling::*[name() = name(current())] 

Je nach Kontext, müssen Sie name(.) im ersten Teil verwenden.

0

Sie könnten in Variablen für die spätere Handhabung früheren und aktuellen verfolgen. I.e. Sie können Tag (i-2), Tag (i-1) behalten und mit ihnen im Tag (i) arbeiten.

Nur eine andere Idee.

Grüße.