XProc / Sequenz transformieren und filtern
![]() |
![]() |
➪ Diese Seite zeigt die Funktionsweise einer XProc-Pipeline.
In Lambda-Expressions in Java habe ich in map / filter / reduce ein Beispiel gezeigt, wie die Werte einer Integer-Sequenz (stream) quadriert und anschliessend gefiltert (alle Werte, die ohne Rest durch 3 teilbar sind) werden. Dasselbe Beispiel habe ich in for-each in anderer Weise gelöst. Um die Funktionsweise der XProc-Pipeline zu demonstrieren, versuche ich dasselbe hier noch einmal.
<p:declare-step
xmlns:p="http://www.w3.org/ns/xproc"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:c="http://www.w3.org/ns/xproc-step" version="1.0">
<p:input port="source" sequence="true">
<p:inline><null/></p:inline>
</p:input>
<p:input port="parameters" kind="parameter"/>
<p:output port="result" sequence="true"/>
<p:xslt name="generiere_Ursprungszahlen">
<p:input port="stylesheet">
<p:inline>
<xsl:stylesheet version="2.0" exclude-result-prefixes="xs c">
<xsl:output method="xml" indent="yes"/>
<xsl:variable name="vstart" select="5"/>
<xsl:variable name="vende" select="19"/>
<xsl:template match="/">
<ergebnis>
<xsl:for-each
select="(xs:integer($vstart) to xs:integer($vende))">
<wert><xsl:value-of select="."/></wert>
</xsl:for-each>
</ergebnis>
</xsl:template>
</xsl:stylesheet>
</p:inline>
</p:input>
</p:xslt>
<p:store href="step1.xml" method="xml" indent="true" />
<p:xslt name="quadriere_Ursprungszahlen">
<p:input port="source">
<p:pipe step="generiere_Ursprungszahlen" port="result"/>
</p:input>
<p:input port="stylesheet">
<p:inline>
<xsl:stylesheet version="2.0"
exclude-result-prefixes="xs c">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/ergebnis">
<ergebnis2>
<xsl:for-each select="//wert">
<wert2><xsl:value-of select=". * ."/></wert2>
</xsl:for-each>
</ergebnis2>
</xsl:template>
</xsl:stylesheet>
</p:inline>
</p:input>
</p:xslt>
<p:store href="step2.xml" method="xml" indent="true" />
<p:xslt name="filtere_quadrierte_Ursprungszahlen">
<p:input port="source">
<p:pipe step="quadriere_Ursprungszahlen" port="result"/>
</p:input>
<p:input port="stylesheet">
<p:inline>
<xsl:stylesheet version="3.0"
exclude-result-prefixes="xs c">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/ergebnis2">
<ergebnis3>
<!-- Alternativ:
<xsl:for-each select="//wert2[. mod 3 = 0]">
<wert3><xsl:value-of select="."/></wert3>
</xsl:for-each>
-->
<xsl:for-each select="filter(
//wert2,
function($a as xs:integer) {$a mod 3 = 0})">
<wert3><xsl:value-of select="."/></wert3>
</xsl:for-each>
</ergebnis3>
</xsl:template>
</xsl:stylesheet>
</p:inline>
</p:input>
</p:xslt>
<p:store href="step3.xml" method="xml" indent="true" />
<p:xslt name="summiere_gefilterte_quadrierte_Ursprungszahlen">
<p:input port="source">
<p:pipe step="filtere_quadrierte_Ursprungszahlen" port="result"/>
</p:input>
<p:input port="stylesheet">
<p:inline>
<xsl:stylesheet version="2.0"
exclude-result-prefixes="xs c">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/ergebnis3">
<ergebnis4>
<xsl:value-of select="sum(//wert3)"/>
</ergebnis4>
</xsl:template>
</xsl:stylesheet>
</p:inline>
</p:input>
</p:xslt>
</p:declare-step>
Das Resultat dieser Pipeline lautet:
<ergebnis4>810</ergebnis4>
wg / 16. Juni 2020
Fragen? Anmerkungen? Tipps?
Bitte nehmen Sie Kontakt zu mir auf.
ᐃ XProc
V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn
☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de