C#.NET * C++ * JAVASCRIPT * PYTHON * DIVERSES
XML * XML-SCHEMA * XPATH * XSL * XSL-FO * SVG * XQUERY * XPROC * ANT



XPath / XPath-Funktionen / XPath: Sequenz-Funktionen / XPath: subsequence

XPath: subsequence

XPath: subsequence

➪ Die subsequence-Funktion kann aus einer Sequenz einzelne Teile filtern, die sich über die Position und die Anzahl der Items definiert.

Auf dieser Seite:

Die Position eines Items lässt sich (sofern nicht bekannt) über die -Funktion ermitteln.

Angenommen, die ursprüngliche Sequenz der Items würde so ermittelt:


//Mensch[contains(name, 'e')]/name

... und Sie bekämen die Sequenz:


<name>Herzlos</name>
<name>Wertlos</name>
<name>Ruhelos</name>
<name>Rielos</name>
<name>Bodenlos</name>
<name>Muehelos</name>
<name>Leinenlos</name>
<name>Hefeklos</name>

... so könnten Sie mithilfe von subsequence ab der Index-Position 3


//Mensch[contains(name, 'e')]/name => subsequence(3)

... alternativ, wenn Sie nicht wissen, an welcher Stelle "Ruhelos" zu finden ist:


function($sequence){
  $sequence 
  => subsequence(
    $sequence => index-of('Ruhelos')
  )   
}(//Mensch[contains(name, 'e')]/name)

... dieses Ergebnis erhalten:


<name>Ruhelos</name>
<name>Rielos</name>
<name>Bodenlos</name>
<name>Muehelos</name>
<name>Leinenlos</name>
<name>Hefeklos</name>

Hier sehen Sie den klaren Vorteil von subsequence: Um mithilfe von und dasselbe zu erreichen, müssten Sie so arbeiten:


(//Mensch[contains(name, 'e')]/name)[text()='Ruhelos'], 
(//Mensch[contains(name, 'e')]/name)[text()='Ruhelos']
    /following::Mensch[contains(name, 'e')]/name

subsequence in XSLT

Analog deklarieren Sie eine XSLT-Variable vseq.


<xsl:variable 
     name="vseq" 
     select="//Mensch[contains(name, 'e')]" 
     as="item()*"/>

Zur Demonstration wird die Sequenz selber ausgegeben; hilfsweise wird hierfür ein separates Template "out" verwendet (siehe unten), dem die Sequenz $vseq als Parameter pseq übergeben wird (in beiden Fällen handelt es sich um eine Itemliste, die grundsätzlich auch leer sein kann: item()*).


<xsl:call-template name="out">
    <xsl:with-param name="pseq" 
         select="$vseq"/>
</xsl:call-template>

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>

Starten Sie nun mit der subsequence ab der dritten Position, so beginnt die Ausgabe bei "Ruhelos".


<xsl:call-template name="out">
    <xsl:with-param name="pseq" select="subsequence($vseq, 3)"/>
</xsl:call-template>  

Resultat:


<m nr="1">Ruhelos</m>
<m nr="2">Rielos</m>
<m nr="3">Bodenlos</m>
<m nr="4">Muehelos</m>
<m nr="5">Leinenlos</m>

Dasselbe Ergebnis erhalten Sie durch Verwendung von index-of:


<xsl:call-template name="out">
    <xsl:with-param name="pseq" 
      select="subsequence($vseq, 
                          index-of($vseq/name, 'Ruhelos'))"/>
</xsl:call-template>

subsequence hat optional drei Parameter: Der erste ist die ursprüngliche Sequenz, der zweite Parameter stellt den Beginnindex dar (muss also eine Zahl sein!), der dritte Parameter definiert die Anzahl der Items.


<xsl:call-template name="out">
    <xsl:with-param 
         name="pseq" 
         select="subsequence($vseq, 2, 3)"/>
</xsl:call-template>

Resultat:


<m nr="1">Wertlos</m>
<m nr="2">Ruhelos</m>
<m nr="3">Rielos</m>

Hier finden Sie noch einmal das oben aufgerufene Template zur Ausgabe.


<xsl:template name="out">
    <xsl:param name="pseq" as="item()*"/>
    <xsl:for-each select="$pseq">
      <m>
        <xsl:value-of select="name"/>
      </m>
    </xsl:for-each>
</xsl:template>

wg / 4. April 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/subsequence.html