XPath 3.0, XPath 2.0, XPath 1.0 / XPath Funktionen / XPath: Sequence - 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().

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

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

position()

Die "position()"-Funktion bietet hilfreich Unterstützung bei der Numerierung, auch unter Einsatz von Filtern und Sortierungen.


        <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, daß 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 paßt.

Zur Verdeutlichung legen wir eine Variable "vseq" fest, die eine Sequenz mehrerer Items umfassen kann (hier: Liste aller Menschen im XML input, deren Childnode "name" ein "e" beinhaltet). Die Deklaration as="item()*" zeigt, daß die Sequenz auch leer sein kann.

item() es muss exakt 1 Item vorhanden sein.
item()? optional: es kann maximal ein Item vorhanden sein, es kann sich auch um eine leere Sequenz handeln.
item()+ mandantory: es muß 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, daß die Sequenz mehrere Items umfaßt, starten wir einen Loop ü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 / 5. November 2017



Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf:

Vorname
Nachname
Mailadresse







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: info2018@wilfried-grupe.de

www.wilfried-grupe.de/indexof.html