Home
Über mich
Veröffentlichungen

XML XML-Schema XPath XSL-T XSL-FO XQuery XProc SVG

XProc / p:choose

p:choose

p:choose

➪ Das XProc-Element p:choose hat keinen Input, sondern ist ein Container, der genau eine aus einer Liste alternativen Subpipelines auswählt. - Diese Seite zeigt die Struktur von p:choose aus dem XProc-Namespace http://www.w3.org/ns/xproc.

Auf dieser Seite:

In http://www.w3.org/TR/2010/REC-xproc-20100511/: XProc An XML Pipeline Language.htm wird die Struktur so beschrieben:


<p:choose
  name? = NCName>
    (p:xpath-context?,
     p:variable*,
     p:when*,
     p:otherwise?)
</p:choose>

Siehe auch

Beispiele zu p:choose


<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:document href="Ort_Elemente.xml"/>
 </p:input>
 <p:input port="parameters" kind="parameter"/>
 <p:output port="result" sequence="true"/>
 <p:choose>
  <p:when test="count(Orte/Ort) &gt; 2">
   <p:xslt>
    <p:input port="stylesheet">
     <p:inline>
      <xsl:stylesheet version="2.0">
       <xsl:template match="/">
        <RESULTS>
         <xsl:for-each 
              select="/Orte/Ort[position() &gt; 2]">
          <ueberzaehligerOrt id="{id}" name="{name}"/>
         </xsl:for-each>
        </RESULTS>
       </xsl:template>
      </xsl:stylesheet>
     </p:inline>
    </p:input>
    <p:input port="parameters">
     <p:empty/>
    </p:input>
   </p:xslt>
  </p:when>
  <p:otherwise>
   <p:identity/>
  </p:otherwise>
 </p:choose>
</p:declare-step>

Ergebnis


<RESULTS>
 <ueberzaehligerOrt id="3" name="Kapstadt"/>
</RESULTS>

Als Alternative zu xsl:result-document 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="Wilma" 
                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="Wilma" 
        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 kombinierte XML-Schema-Validierung des Transformations-Ergebnisses ist 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 Schematron-Validierung einer ganzen Liste 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(
       'XML_Dateipfad/?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

<hr/>

pic/xproc_30_choose.svg

Diese Seite bietet keine offizielle Darstellung von http://www.w3.org/ns/xproc, sondern dient dem individuellen Versuch, gegenseitige Abhängigkeiten zwischen Elementen und Attributen in diesem Namespace in vereinfachter Form darzustellen, soweit sich diese aus meinen bisherigen, vorläufigen Recherchen ergeben haben. Dabei kann ich evtl. Irrtümer oder Versehen nicht ausschließen, eine Haftung kann ich daher auch nicht übernehmen.

Mögliche Parentnodes

Mögliche Childnodes

Mögliche Attribute

pic/xproc_30_choose_depends.svg

pic/xproc_30_choose_expand-text.svg

pic/xproc_30_choose_id.svg

pic/xproc_30_choose_message.svg

pic/xproc_30_choose_name.svg

pic/xproc_30_choose_timeout.svg

pic/xproc_30_choose_use-when.svg

wg / 13. August 2021



Fragen? Anmerkungen? Tipps?

Bitte nehmen Sie Kontakt zu mir auf.




XProc

p:catch

p:compare



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_30_choose.html