XPath / XPath-Funktionen / XPath: Sequenz-Funktionen / XPath: for-each-pair
![]() |
![]() |
➪ Die XPath-Funktion for-each-pair bildet Kombinationen aus zwei Sequenzen, die dieselbe Anzahl Items haben müssen.
Hat eine Sequenz mehr Items als die andere, dann werden die überschüssigen Items ignoriert.
for-each-pair benötigt drei Parameter:
Die Kombination aus den beiden Sequenzen
sowie der Funktionsaufruf concat ...
<xsl:template match="/">
<root>
<xsl:for-each
select="for-each-pair(
(1 to 3),
('Holzflos', 'Denzschlos', 'Ratlos'),
concat#2)">
<wert>
<xsl:value-of select="."/>
</wert>
</xsl:for-each>
</root>
</xsl:template>
... ergibt dieses Resultat:
<root>
<wert>1Holzflos</wert>
<wert>2Denzschlos</wert>
<wert>3Ratlos</wert>
</root>
Dagegen haben die Argumente
<xsl:template match="/">
<root>
<xsl:for-each
select="for-each-pair(
(3 to 7)[. mod 2 = 1],
(18 to 30),
function($p1, $p2){$p1+$p2*100})">
<wert>
<xsl:value-of select="."/>
</wert>
</xsl:for-each>
</root>
</xsl:template>
... dieses Ergebnis:
<root>
<wert>1803</wert>
<wert>1905</wert>
<wert>2007</wert>
</root>
Dasselbe Ergebnis erhalten Sie beim Aufruf der for-each-pair-Funktion in XQuery:
<root>{
(3 to 7)[. mod 2 = 1]
=> for-each-pair(
(18 to 30),
function($p1, $p2){
element{'wert'}{$p1+$p2*100}
}
)
}</root>
Auch hier ist die typsaubere Parameterübergabe sowie die Deklaration des Rückgabetyps der Funktion empfehlenswert, in diesem Fall also xs:integer. Der Aufruf generiert dasselbe Ergebnis wie vorher.
<root>
{
for $x in for-each-pair(
(3 to 7)[. mod 2 = 1], (18 to 30),
function($p1 as xs:integer, $p2 as xs:integer)
as xs:integer
{$p1+$p2*100})
return
<wert>
{$x}
</wert>
}
</root>
wg / 3. 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