(aktualisiert!)

IT-Trainings in Zeiten des Corona-Virus, Veranstaltungstipps der www.gfu.net:
Schulung XML Einfuehrung und Grundlagen *** Schulung Python fuer Programmiereinsteiger *** Schulung XML, XSLT, XPath, XSL-FO Einfuehrung *** Schulung Java/JSP/HTML/JDBC/XML Komplett *** Schulung XML mit Altova XMLSpy *** Schulung XML Grundlagen, XSL-FO, SVG, DocBook, DITA *** Schulung XML - der professionelle Ueberblick *** Schulung XML-Schema Intensiv *** Schulung Einstieg in die Programmierung *** Schulung C++ fuer Programmiereinsteiger *** Schulung VB.NET fuer Visual Basic-Programmierer ***


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().

Auf dieser Seite:

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

position()

Signatur: position() as xs:integer

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()

Signatur: last() as xs:integer

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

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 .

wg / 14. Januar 2020



Fragen? Anmerkungen? Tipps?

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