Gern stehe ich zur fachlichen Unterstützung in XML-Technologien, C#.NET, VisualBasic.NET und Java zur Verfügung. Sprechen Sie mich einfach an: Mail oder ☎ 0151 . 750 360 61


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

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

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

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

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

wg / 11. Mai 2019



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