XPath / XPath-Funktionen / XPath: Sequenz-Funktionen / XPath: index-of(), position(), last()
![]() |
![]() |
➪ XPath bietet eine Reihe von Spezialfunktionen zur Positionsbestimmung eines Items in einer Sequenz, beispielsweise index-of(), position(), last().
Auf dieser Seite:Für die praktische Programmierung unentbehrlich sind Funktionen zur Positionsbestimmung eines Items in einer Sequenz, etwa bei Nummerierungen oder Fallunterscheidungen.
Signatur: position() as xs:integer
Die position()"-Funktion bietet hilfreiche Unterstützung bei der Nummerierung, auch unter Einsatz von Filtern und Sortierungen.
<xsl:for-each select="//Mensch[Gehalt < 1000]">
<xsl:sort select="Gehalt"
data-type="number"
order="descending"/>
<Person>
<nr>
<xsl:value-of select="position()"/>
</nr>
</Person>
</xsl:for-each>
Signatur: last() as xs:integer
Die last()-Funktion gibt die Position des letzten Kontextnodes zurück. Das findet häufig Anwendung bei Fallunterscheidungen (if, choose), etwa um sicherzustellen, dass nach dem letzten Item keine weitere Aktion erfolgt.
<xsl:for-each select="//Mensch[Gehalt < 1000]">
<xsl:value-of select="vorname"/>
<xsl:if test="position() != last()">
<br/>
</xsl:if>
</xsl:for-each>
Signaturen: index-of( $seq as xs:anyAtomicType*, $search as xs:anyAtomicType) as xs:integer* sowie index-of( $seq as xs:anyAtomicType*, $search as xs:anyAtomicType, $collation as xs:string) as xs:integer*.
Die index-of-Funktion ermittelt aus einer Sequenz die Position jenes Items, auf die ein Suchpattern passt. index-of(('Holzflos', 'Problemlos', 'Sprachlos'), 'Problemlos') ergibt '2'. index-of(((1 to 20)[. mod 3=0]), 12 ) ergibt '4'.
Zur Verdeutlichung lege ich eine Variable "vseq" fest, die eine Sequenz mehrerer Items umfassen kann (hier: Liste aller Mensch-Nodes im XML-Input, deren Childnode name ein "e" beinhaltet). Die Deklaration as="item()*" zeigt, dass die Sequenz auch leer sein kann.
item() | Es muss exakt ein Item vorhanden sein. |
item()? | optional: Es kann maximal ein Item vorhanden sein, es kann sich auch um eine leere Sequenz handeln. |
item()+ | mandantory: Es muss mindestens ein Item vorhanden sein, auch mehrere sind erlaubt. |
item()* | Optional oder beliebig viele Items. |
<xsl:variable
name="vseq"
select="//Mensch[contains(name, 'e')]"
as="item()*"/>
Zur Verdeutlichung, dass die Sequenz mehrere Items umfasst, starten Sie eine Schleife über die Variable $vseg.
<xsl:for-each select="$vseq">
<m nr="{position()}">
<xsl:value-of select="name"/>
</m>
</xsl:for-each>
Resultat:
<m nr="1">Herzlos</m>
<m nr="2">Wertlos</m>
<m nr="3">Ruhelos</m>
<m nr="4">Rielos</m>
<m nr="5">Bodenlos</m>
<m nr="6">Muehelos</m>
<m nr="7">Leinenlos</m>
Um nun den Index jenes Items (hinter der Itemliste befinden sich mehrere Mensch-Elemente) herauszufinden, dessen Childnode name den Inhalt "Rielos" hat, genügt der Einsatz der index-of-Funktion.
<xsl:value-of
select="index-of($vseq/name, 'Rielos')"/>
Zum Einsatz der "index-of"-Funktion siehe subsequence.
wg / 14. Januar 2020
Fragen? Anmerkungen? Tipps?
Bitte nehmen Sie Kontakt zu mir auf.
V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn
☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de