XML * XML-SCHEMA * XPATH * XSL * XSL-FO * SVG * XQUERY * XPROC * ANT * DIVERSES



XProc / Sequenz transformieren und filtern

Sequenz transformieren und filtern

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



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/XProc1.html