XML | XML-Schema | XPath | XSL-T | XSL-FO | XQuery | XProc | SVG |
XProc / 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
<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) > 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() > 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>
<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"/>
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>
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
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/>
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.
wg / 13. August 2021
Fragen? Anmerkungen? Tipps?
Bitte nehmen Sie Kontakt zu mir auf.
V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn
☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de