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 Multi-Container Steps

Abb. Multi-Container Steps

Die wesentlichen Multi-Container Steps

Es gibt in XProc zwei Multi-Container 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, dass 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) &gt; 1">
      <p:store href="mehralseinedatei.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-Ausdrücke 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 >>
Tipp der data2type-Redaktion:
Zum Thema XProc bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an: