XML | XML-Schema | XPath | XSL-T | XSL-FO | XQuery | XProc | SVG |
XPath / XPath-Funktionen / XPath: Sequenz-Funktionen / 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 index-of-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 Sequenzverkettung und following 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
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.
V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn
☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de