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
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:
- Sie tun:
<xsl:apply-templates select="*" /><!-- select 3 nodes (a,b,c) -->
- Der XSLT-Prozessor Liste der Knoten machen verarbeitet werden (a, b, c)
- Für jeden dieser Knoten, der XSLT-Prozessor wählt und führt eine passende schablone
- Wenn die Vorlage aufgerufen wird, wird der
current()
Knoten definiert ist, undposition()
definiert ist, aber anders als das die Vorlage keine k hat Kenntnis des Ausführungsflusses. - 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>
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.
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.
- 1. XSL: T Benchmarking
- 2. XSL xsl: Vorlage match = "/"
- 3. xsl: Variable in xsl Dateipfad übergeben
- 4. Unterschied zwischen xsl: param und xsl: variable
- 5. XSL-Querverweis
- 6. xsl Transformation
- 7. Jan \t Februar \t Mar \t April \t Mai \t Juni \t Juli \t August \t September \t Oktober \t November \t Dezember \t Summe
- 8. Eine xsl "Variable" an eine xsl anhängen: if test
- 9. xsl: sort inhomogenen Elemente in xsl: for-each
- 10. xsl: xsl: value-of und E-Mail-Adressen
- 11. XSL Wie verkette ich Text mit xsl: number?
- 12. Wert von xsl ausgeben: Variable mit xsl: Wert von Problem
- 13. xsl: strip-space kombiniert mit xsl: Text vermasselt automatische Einrückung
- 14. xsl: Variable als Xpath-Wert für andere xsl-Tag
- 15. Relativer Pfad für xsl: import oder xsl: include
- 16. Switch Case in XSL
- 17. XSL substring und indexOf
- 18. Reverse XSL-Ausgabe
- 19. XSL: Wie Summe insgesamt?
- 20. XML-Ersatz mit XSL
- 21. XML Sortierung XSL
- 22. Über die xsl-Verarbeitung
- 23. Apostroph Textvergleich in xsl
- 24. Conditional Autoinkrement in xsl
- 25. XSL-FO - Leeren Blockelemente
- 26. XSL Help erforderlich
- 27. XSL Zeichen Flucht Problem
- 28. XSL numerische generate-id()
- 29. xsl: for-each Schleifenzähler
- 30. xml transformieren zu xsl
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
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
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