Aktuelle Remote-Seminare mit Durchführungsgarantie: Etwas Werbung in eigener Sache Termine: 21.09.-23.09.2020, 23.11.-25.11.2020, 07.12.-09.12.2020, 22.03.-24.03.2021, 07.06.-09.06.2021, 06.09.-08.09.2021XML Einführung und Grundlagen Termine: 20.10.2020, 13.11.2020, 10.12.2020, 25.03.2021, 10.06.2021, 09.09.2021XML - der professionelle Überblick Termine: 23.11.-26.11.2020, 29.03.-01.04.2021Einstieg in die Programmierung Termine: 14.12.-16.12.2020, 07.04.-09.04.2021XML, XSLT, XPath, XSL-FO Einführung Termine: Termin nach WunschEinstieg in C#.NET Termine: 21.09.-23.09.2020, 11.01.-13.01.2021, 26.05.-28.05.2021, 27.09.-29.09.2021VB.NET für Visual Basic-Programmierer Termine: 14.12.-16.12.2020, 08.03.-10.03.2021, 19.07.-21.07.2021, 23.08.-25.08.2021XML Grundlagen, XSL-FO, SVG, DocBook, DITA Termine: Termin nach WunschJava Grundlagen Termine: 30.11.-03.12.2020, 29.03.-01.04.2021C++ für Programmiereinsteiger Termine: 10.09.2020, 11.12.2020, 16.03.2021Neues Seminar: XProc Grundlagen Termine: 21.09.-25.09.2020, 01.03.-05.03.2021Java/JSP/HTML/JDBC/XML Komplett Termine: 07.09.-09.09.2020, 21.10.-23.10.2020, 23.11.-25.11.2020, 25.01.-27.01.2021, 12.04.-14.04.2021, 26.07.-28.07.2021Python für Programmiereinsteiger Last-Minute-Seminare, noch freie Plätze Python für Programmiereinsteiger07.09.-09.09.2020 XML Einführung und Grundlagen21.09.-23.09.2020 XML, XSLT, XPath, XSL-FO Einführung14.12.-16.12.2020

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



XProc / p:for-each / XProc: p:for-each, p:choose, p:xslt, p:validate-with-xml-schema, p:validate-with-schematron

XProc: p:for-each, p:choose, p:xslt, p:validate-with-xml-schema, p:validate-with-schematron

XProc: p:for-each, p:choose, p:xslt, p:validate-with-xml-schema, p:validate-with-schematron

➪ Mit p:for-each, p:iteration-source, p:iteration-position(), p:choose, p:when, p:store, bietet XProc eine gute Möglichkeit zum fallgesteuerten Abspeichern mehrerer Items einer Sequenz. Auch die XSD- und Schematron-Validierungen sind effizient nutzbar.

Auf dieser Seite:

Als Alternative zu bietet sich die Arbeit mit p:for-each, p:iteration-source, p:iteration-position(), p:choose, p:when, p:store an.


<?xml version="1.0" encoding="UTF-8"?>
<p:declare-step 
  xmlns:p="http://www.w3.org/ns/xproc" 
  xmlns:c="http://www.w3.org/ns/xproc-step"
  version="1.0" 
  exclude-inline-prefixes="c">
  <p:input port="source">
    <p:inline>
      <ROOT>
        <Mensch name="Holzflos" vorname="Hugo" alter="44" geschl="m"/>
        <Mensch name="Trauerklos" vorname="Theo" alter="33" geschl="m"/>
        <Mensch name="Sinnlos" vorname="Simone" alter="22" geschl="w"/>
        <Mensch name="Wunschlos" vorname="Konny" alter="38" geschl="d"/>
      </ROOT>
    </p:inline>
  </p:input>
  <p:for-each>
    <p:iteration-source select="/ROOT/Mensch"/>
    <p:choose>
      <p:when test="/*/@geschl='w'">
        <p:store method="xml" omit-xml-declaration="false" indent="true"
          encoding="ISO-8859-1">
          <p:with-option name="href"
            select="concat('../output/weiblich/_', 
              /*/local-name(), '_', 
              /*/@name, '_', 
              p:iteration-position(), '.xml')"/>
        </p:store>
      </p:when>
      <p:when test="/*/@geschl='d'">
        <p:store method="xml" omit-xml-declaration="false" indent="true"
          encoding="ISO-8859-1">
          <p:with-option name="href"
            select="concat('../output/divers/_', 
              /*/local-name(), '_', 
              /*/@name, '_', 
              p:iteration-position(), '.xml')"/>
        </p:store>
      </p:when>
      <p:otherwise>
        <p:store method="xml" omit-xml-declaration="false" indent="true"
          encoding="ISO-8859-1">
          <p:with-option name="href"
            select="concat('../output/maennlich/_', 
              /*/local-name(), '_', 
              /*/@name, '_', 
              p:iteration-position(), '.xml')"/>
        </p:store>
      </p:otherwise>
    </p:choose>
  </p:for-each>
</p:declare-step>

Das Ergebnis sind mehrere Verzeichnisse mit den darin enthaltenen Einzel-XML-Dokumenten. So ist der Inhalt von output/divers/_Mensch_Wunschlos_4.xml:


<?xml version="1.0" encoding="ISO-8859-1"?>
<Mensch name="Wunschlos" vorname="Konny" alter="38" geschl="d"/>

p:xslt mit p:store

Problemlos funktioniert auch das Abspeichern mit p:store nach vorheriger Einzelkonvertierung via p:xslt.


<?xml version="1.0" encoding="UTF-8"?>
<p:declare-step 
  xmlns:p="http://www.w3.org/ns/xproc" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:c="http://www.w3.org/ns/xproc-step"
  version="3.0" 
  exclude-inline-prefixes="c">
  <p:input port="source">
    <p:inline>
      <ROOT>
        <Mensch name="Holzflos" vorname="Hugo" alter="44" geschl="m"/>
        <Mensch name="Trauerklos" vorname="Theo" alter="33" geschl="m"/>
        <Mensch name="Sinnlos" vorname="Simone" alter="22" geschl="w"/>
        <Mensch name="Wunschlos" vorname="Konny" alter="38" geschl="d"/>
      </ROOT>
    </p:inline>
  </p:input>
  <p:for-each>
    <p:iteration-source select="/ROOT/Mensch"/>  
    <p:xslt>
      <p:input port="stylesheet">
        <p:inline>
          <xsl:stylesheet version="2.0" >
            <xsl:output method="xml" indent="yes"/>
            <xsl:template match="Mensch">
              <Person>
                <xsl:for-each select="attribute::*">
                  <xsl:element name="{name()}">
                    <xsl:value-of select="."/>
                  </xsl:element>
                </xsl:for-each>
              </Person>       
            </xsl:template>
          </xsl:stylesheet>
        </p:inline>
      </p:input>
      <p:input port="parameters">
        <p:empty/>
      </p:input>
    </p:xslt>
    <p:store 
        method="xml" 
        omit-xml-declaration="false" 
        indent="true" 
        encoding="ISO-8859-1">
      <p:with-option name="href"
        select="concat('../output/', 
          /*/local-name(), '_', 
          /*/name, '_', 
          p:iteration-position(), '.xml')"/>
    </p:store>      
  </p:for-each>
</p:declare-step>

Das Resultat sind in diesem Fall mehrere XML-Dokumente mit diesem Aufbau (hier im Beispiel output/Person_Sinnlos_3.xml):


<?xml version="1.0" encoding="ISO-8859-1"?>
<Person>
  <name>Sinnlos</name>
  <vorname>Simone</vorname>
  <alter>22</alter>
  <geschl>w</geschl>
</Person>

p:for-each mit p:xslt und p:validate-with-xml-schema

Auch die XML-Schema-Validierung des Transformations-Ergebnisses ist immer vorteilhaft.


<?xml version="1.0" encoding="UTF-8"?>
<p:declare-step 
  xmlns:p="http://www.w3.org/ns/xproc" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:c="http://www.w3.org/ns/xproc-step"
  version="1.0" 
  exclude-inline-prefixes="c">
  <p:input port="source">
    <p:inline>
      <ROOT>
        <Mensch name="Holzflos" vorname="Hugo" alter="44" geschl="m"/>
        <Mensch name="Trauerklos" vorname="Theo" alter="33" geschl="m"/>
        <Mensch name="Sinnlos" vorname="Simone" alter="22" geschl="w"/>
        <Mensch name="Wunschlos" vorname="Konny" alter="38" geschl="d"/>
      </ROOT>
    </p:inline>
  </p:input>
  <p:output port="result" sequence="true"/> 
  <p:for-each>
    <p:iteration-source select="/ROOT/Mensch"/>  
    <p:xslt name="Mensch2PERSON">
      <p:input port="stylesheet">
        <p:inline>
          <xsl:stylesheet version="2.0" >
            <xsl:output method="xml" indent="yes"/>
            <xsl:template match="Mensch">
              <PERSON>
                <xsl:for-each select="attribute::*">
                  <xsl:element name="{upper-case(name())}">
                    <xsl:value-of select="."/>
                  </xsl:element>
                </xsl:for-each>
              </PERSON>       
            </xsl:template>
          </xsl:stylesheet>
        </p:inline>
      </p:input>
      <p:input port="parameters">
        <p:empty/>
      </p:input>
    </p:xslt>    
    <p:validate-with-xml-schema>
      <p:input port="schema">
        <p:inline>
          <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
            <xs:simpleType name="stringmax20">
              <xs:restriction base="xs:string">
                <xs:minLength value="2"/>
                <xs:maxLength value="20"/>
                <xs:pattern value="[A-Z][a-zäöü]*"/>
              </xs:restriction>
            </xs:simpleType>
            <xs:element name="PERSON">
              <xs:complexType>
                <xs:all>
                  <xs:element ref="NAME"/>
                  <xs:element ref="VORNAME"/>
                  <xs:element ref="ALTER"/>
                  <xs:element ref="GESCHL"/>
                </xs:all>
              </xs:complexType>
            </xs:element>
            <xs:element name="VORNAME" type="stringmax20"/>
            <xs:element name="NAME" type="stringmax20"/>
            <xs:element name="ALTER" type="xs:nonNegativeInteger"/>
            <xs:element name="GESCHL">
              <xs:simpleType>
                <xs:restriction base="xs:string">
                  <xs:enumeration value="w"/>
                  <xs:enumeration value="m"/>
                  <xs:enumeration value="d"/>
                </xs:restriction>
              </xs:simpleType>
            </xs:element>
          </xs:schema>
        </p:inline>
      </p:input>
    </p:validate-with-xml-schema>
  </p:for-each>  
</p:declare-step>

Das Ergebnis ist eine Sequenz zur weiteren Verwendung:


<PERSON>
  <NAME>Holzflos</NAME>
  <VORNAME>Hugo</VORNAME>
  <ALTER>44</ALTER>
  <GESCHL>m</GESCHL>
</PERSON>
<PERSON>
  <NAME>Trauerklos</NAME>
  <VORNAME>Theo</VORNAME>
  <ALTER>33</ALTER>
  <GESCHL>m</GESCHL>
</PERSON>
<PERSON>
  <NAME>Sinnlos</NAME>
  <VORNAME>Simone</VORNAME>
  <ALTER>22</ALTER>
  <GESCHL>w</GESCHL>
</PERSON>
<PERSON>
  <NAME>Wunschlos</NAME>
  <VORNAME>Konny</VORNAME>
  <ALTER>38</ALTER>
  <GESCHL>d</GESCHL>
</PERSON

p:for-each mit p:validate-with-schematron

Auch die -Validierung einer ganzen von Einzeldateien funktioniert hervorragend mit XProc, die Log-Datei steht hier in Orte_log.xml:


<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:err="http://www.w3.org/2005/xqt-errors"
  xmlns:c="http://www.w3.org/ns/xproc-step" 
  version="1.0">
  <p:input port="source">
    <p:inline>
      <doc/>
    </p:inline>
  </p:input>
  <p:output port="result" primary="true" sequence="true"/>  
  <p:for-each>
    <p:iteration-source 
      select="collection('Verzeichnis_XML_Dateien/?select=*.xml;recurse=no')"/> 
    <p:choose>      
      <p:when test="./Orte/Ort">
        <p:validate-with-schematron assert-valid="false">
          <p:log port="report" href="Orte_log.xml"/>
          <p:input port="schema">
            <p:document href="../schematron/Orte.sch"/>
          </p:input>
          <p:input port="parameters">
            <p:empty/>
          </p:input>
        </p:validate-with-schematron>
      </p:when>
    </p:choose>
  </p:for-each>
</p:declare-step

wg / 5. Dezember 2019



Fragen? Anmerkungen? Tipps?

Bitte nehmen Sie Kontakt zu mir auf.




XProc

p:for-each



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