XPath 3.0, XPath 2.0, XPath 1.0 / XPath-Funktionen / XPath: Sequenz-Funktionen / XPath: index-of(), position(), last()

XPath: index-of(), position(), last()

XPath: index-of(), position(), last()

➪ XPath bietet eine Reihe von Spezialfunktionen zur Positionsbestimmung eines Items in einer Sequenz, beispielsweise index-of(), position(), last().

Für die praktische Programmierung unentbehrlich sind Funktionen zur Positionsbestimmung eines Items in einer Sequenz, etwa bei Nummerierungen oder Fallunterscheidungen.

position()

Die position()"-Funktion bietet hilfreiche Unterstützung bei der Nummerierung, auch unter Einsatz von und .


<xsl:for-each select="//Mensch[Gehalt &lt; 1000]">
    <xsl:sort select="Gehalt" 
              data-type="number" 
              order="descending"/>
    <Person>
        <nr>
            <xsl:value-of select="position()"/>
        </nr>
    </Person>
</xsl:for-each>

last()

Die last()-Funktion gibt die Position des letzten Kontextnodes zurück. Das findet häufig Anwendung bei Fallunterscheidungen (, ), etwa um sicherzustellen, dass nach dem letzten Item keine weitere Aktion erfolgt.


<xsl:for-each select="//Mensch[Gehalt &lt; 1000]">
    <xsl:value-of select="vorname"/>
    <xsl:if test="position() != last()">
        <br/>
    </xsl:if>
</xsl:for-each>

XPath: index-of

Die index-of-Funktion ermittelt aus einer Sequenz die Position jenes Items, auf die ein Suchpattern passt.

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 .

wg / 4. April 2018



Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf.






Vielen Dank für Ihr Interesse an meiner Arbeit.


V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/indexof.html