XProc-Steps

A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

p:split-sequence

<p:declare-step type="p:split-sequence">
   <p:input port="source" sequence="true"/>
   <p:output port="matched" sequence="true" primary="true"/>
   <p:output port="not-matched" sequence="true"/>
   <p:option name="initial-only" select="'false'"/> <!-- boolean -->
   <p:option name="test" required="true"/> <!-- XPathExpression -->
</p:declare-step>

Der <p:split-sequence>-Step teilt ein Dokument, ausgehend vom Resultat eines entsprechenden XPath-Ausdrucks, in zwei Kategorien auf. Die Dokumente werden am Input-Port “source“ geladen. Es gibt zwei Output-Ports (“matched“ und “not-matched“). Der Option “test“ wird ein XPath-Ausdruck übergeben. Dieser Ausdruck wird beim Ausführen auf sämtliche Dokumente angewendet. Ist der Ausdruck gültig, also trifft er auf das aktuell gelesene Dokument zu, wird eine vollständige Kopie des Dokuments auf den Output-Port “matched“ geschrieben. Analog dazu wird eine vollständige Kopie des Dokuments auf den “not-matched“-Output-Port geschrieben, falls der XPath-Ausdruck nicht zutrifft. Ist die Option “initial-only“ auf “true“, also wahr, gesetzt, so wird ab dem Zeitpunkt, wo ein Dokument die XPath-Bedingung nicht erfüllt, das aktuelle und alle folgenden (unabhängig davon, ob sie die XPath-Bedingung erfüllen oder nicht) Dokumente auf den “not-matched“-Ouput-Port geschrieben.

Beispiel

Im folgenden Beispiel werden zwei Dokumente eingelesen und durch einen <p:split-sequence>-Step geschickt. Das erste Dokument erfüllt den XPath-Ausdruck und das zweite nicht.

<?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" sequence="true">
      <p:document href="filmsammlung.xml"/>
      <p:document href="filmsammlung_3.xml"/>
   </p:input>
   <p:split-sequence test="/FilmSammlung" name="Split"/>
   <p:identity>
      <p:input port="source">
         <p:pipe port="matched" step="Split"/>
      </p:input>
   </p:identity>
   <p:store href="matched.xml"/>
   <p:identity>
      <p:input port="source">
         <p:pipe port="not-matched" step="Split"/>
      </p:input>
   </p:identity>
   <p:store href="not-matched.xml"/>
</p:declare-step>

Zunächst werden die initalen Dokumente am Input-Port (“source“) via <p:document> eingelesen. Dem Step <p:split-sequence> wird als Option der XPath-Ausdruck “/FilmSammlung“ übergeben. Er prüft also, ob das Wurzelelement des Dokuments “FilmSammlung“ ist. Wenn dies zutrifft, wird das Dokument auf den primären Output-Port “matched“ geschrieben, andernsfalls auf “not-matched“. Diese Ausgaben werden von <p:identity> abgefangen und dann von <p:store> geschrieben.

<FilmSammlung>
[...]
</FilmSammlung>
<FilmSammlungAnders>
[...]    
</FilmSammlungAnders>
 

Im Beispiel differiert der Name des Wurzelelements der Dokumente “filmsammlung.xml“ und “filmsammlung_anders.xml“. Ersterer trifft auf den XPath-Ausdruck zu und wird entsprechend auf “matched“ ausgegeben, “filmsammlung_anders.xml“ wird auf “not-matched“ geschrieben.

Tipp der data2type-Redaktion:
Zum Thema XProc bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an: