XSL(T) Strom/vorherige/nächste

Ich weiß, dass es die current() function to retrieve the current node in XSL, but is there a way to be able to reference the "previous" and "next" nodes in reference to the current position? Funktion gibt, um den aktuellen Knoten in XSL abzurufen, aber gibt es eine Möglichkeit, auf die "vorherigen" und "nächsten" Knoten in Bezug auf die aktuelle Position verweisen zu können?

Antwort auf "XSL(T) Strom/vorherige/nächste " 3 von antworten

Angenommen, Sie sprechen über die nächsten und vorherigen Knoten in der Dokumentstruktur, im Gegensatz zum aktuellen Ausführungsfluss (z. B. eine for-each loop), see the -Schleife), siehe die Achsen preceding-sibling and und following-sibling axes: : XPath Axes on W3. .

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

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

Je nach Kontext müssen Sie möglicherweise name(.) in the first part. im ersten Teil verwenden.

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

Denn wenn z.B. Vorlagen angewendet werden, gehen die Mechaniken so:

  1. Sie tun: <xsl:apply-templates select="*" /><!-- select 3 nodes (a,b,c) -->
  2. Der XSLT-Prozessor erstellt eine Liste der zu verarbeitenden Knoten (a,b,c)
  3. Für jeden dieser Knoten, Der XSLT-Prozessor wählt eine übereinstimmende Vorlage
  4. aus und führt sie aus. Wenn die Vorlage aufgerufen wird, wird der Knoten current() node is defined, and definiert, und position() is defined, but other than that the template has no knowledge of the execution flow. ist definiert, aber abgesehen davon, dass die Vorlage keine Kenntnis vom Ausführungsfluss hat.
  5. Ausführungsreihenfolge unterliegt den Prozessoreinstellungen, solange das Ergebnis garantiert gleich ist. Ihre (theoretischen) Vorhersagen können für einen Prozessor und für einen anderen falsch sein. Für eine Nebenwirkungen freie Programmiersprache wie XSLT, Wissen wie dieses wäre eine gefährliche Sache, denke ich (weil die Menschen beginnen würden, auf Ausführungsreihenfolge zu verlassen).

Sie können zwar die XPath-Achsen following::sibling or oder preceding::sibling XPath axes, but that's something different from knowing what node will be processed next verwenden, aber das ist etwas anderes, als zu wissen, welcher Knoten als nächstes

EDIT

verarbeitet wird. Die obige Erklärung versucht, die Frage zu beantworten, wie sie gestellt wurde, aber die OP bedeutete etwas anderes. Es geht nur darum, eindeutige Knoten zu gruppieren/auszustellen.

Wie die OP-Anfrage, hier eine schnelle Demonstration, wie eine Gruppierung mit den XPath-Achsen erreicht werden kann.

XML (die Elemente 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>

Ausgabe:

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

Sie können vorherige und aktuelle Variablen für die spätere Handhabung verfolgen. D.h. Sie können tag(i-2), tag(i-1) behalten und mit ihnen in tag(i) arbeiten.

Nur eine andere Idee.

Grüße.