Multi-Container Steps

Ein Muli-Container Step verfügt über zwei oder mehrere alternative Subpipelines. Somit ist es unter Anderem möglich, fallentscheidungsbasierte Implementierungen zu realiseren.

Abbildung Multicontainer Steps

Abb. Multi-Container Steps

Die wesentlichen Multicontainer-Steps

Es gibt in XProc zwei Multicontainer-Steps: <p:choose> und <p:try>. Diese werden hier vorgestellt und anhand eines Beispiels erklärt.

p:choose

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

Durch <p:choose> können fallbezogene Entscheidungswege implementiert werden. Ausgehend von einem, entsprechenden XSLT Ausdruck, der in <p:when> definiert wird, werden je nach Resultat die entsprechenden Subpipelines ausgeführt. Falls keine Bedingung von <p:when> zutrifft, wird <p:otherwise> (wenn angegeben) durchgeführt, was einem Default Wert entspricht.

<p:when
   test = XPathExpression>
   (p:xpath-context?,
  (p:output |
   p:log)*,
  subpipeline)
</p:when>
 

Der <p:when> Step hat unter “test“ einen XPath Ausdruck als Attribut hinterlegt. Trifft dieser zu, wird seine Subpipeline ausgeführt. Weiterhin kann der Step noch durch <p:xpath-context>, <p:log> und <p:output> konfiguriert bzw. erweitert werden.

<p:otherwise>
   ((p:output |
   p:log)*,
  subpipeline)
</p:otherwise>
 

<p:otherwise> ist der Standard Weg, der von <p:choose> gegangen wird, für den Fall das sämtliche Abfragebedingungen nicht erfüllt werden. Je nach Entscheidung, wird die entsprechende Subpipeline ausgeführt und das Resultat auf den Ouput-Port geschrieben.

Beispiel

Im folgenden Beispiel wird der <p:choose> Step vorgestellt.

<?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">
  <p:input port="source">
    <p:document href="filmsammlung.xml"/>
  </p:input>
  <p:output port="result">
    <p:empty/>
  </p:output>
  <p:choose>
    <p:when test="count(//Film)&amp;gt;1">
      <p:store href="mehrlaseinedatei.xml"/>
    </p:when>
    <p:when test="count(//Film)=1">
      <p:store href="einedatei.xml"/>
    </p:when>
    <p:otherwise>
      <p:store href="standard.xml"/>
    </p:otherwise>
  </p:choose>
</p:declare-step>
 

Im Beispiel wird durch die entsprechenden XPath Ausdrucke innerhalb von <p:when> geprüft wieviele “Film“ Elemente im ursprünglichen Dokument vorliegen. Je nach Fall wird eine entsprechende Datei erzeugt.

p:try

<p:try
   name? = NCName>
   (p:variable*,
   p:group,
   p:catch)
</p:try>
 

Innerhalb eines <p:try> Steps ist sichergestellt, dass eventuell auftretende dynamische Fehler vor einem Abbruch abgefangen werden. Die gewünschte Subpipeline wird innerhalb eines <p:group> Steps zusammengefasst und ausgeführt. Tritt nun ein Fehler auf, wird dieser von einem sogenannten <p:catch> Step erfasst.

<p:catch
  name? = NCName>
  ((p:output |
   p:log)*,
  subpipeline)
</p:catch>
 

Anstatt eines Abbruchs wird nun die Subpipeline innerhalb des <p:catch> Steps ausgeführt. Dies kann je nach Situation eine entsprechend formulierte Fehlerausgabe sein oder auch ein alternativer Weg mit weiteren Steps.

Beispiel

Im folgenden Beispiel wird bewusst ein Fehler produziert um somit in die Subpipeline von <p:catch> zu gelangen.

<?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">
  <p:input port="source">
    <p:document href="filmsammlung.xml"/>
  </p:input>
  <p:output port="result"/>
  <p:try>
    <p:group>
      <p:validate-with-xml-schema assert-valid="true" mode="strict">
        <p:input port="schema">
          <p:document href="beispiel_5_xmlschema.xsd"/>
        </p:input>
      </p:validate-with-xml-schema>
    </p:group>
    <p:catch>
      <p:identity>
        <p:input port="source">
          <p:inline>
            <c:result>Das Dokument ist leider nicht valide</c:result>
          </p:inline>
        </p:input>
      </p:identity>
    </p:catch>
  </p:try>
</p:declare-step>
 

Falls der Step <p:validate-with-xml-schema> einen Fehler produziert, das initale Dokument also nicht valide gegen die zugrundeliegende Schemadatei ist, wird der <p:catch> Step aufgerufen und seine Subpipeline ausgegeben. Im Beispiel eine <p:inline> Ausgabe, mit einem erklärenden Text. Sollte das Dokument also nicht valide sein, wird “Das Dokument ist leider nicht valide“ ausgegeben.

 

<< zurück vor >>