Pipelines

Pipelines sind als das primäre Grundkonzept von XProc zu sehen. Eine Pipeline hat immer einen Eingang und am Ende einen Ausgang, aus welchem das Ausgabedokument produziert wird. Die Pipeline an sich baut sich aus einzelnen Steps (Schritten) zusammen, welche als Teilverarbeitungsschritte zu sehen sind.

Abbildung XProc-Pipeline

Abb. XProc-Pipeline

Eine Pipeline kann sehr lang und komplex werden. Es existieren zwei Möglichkeiten, sie zu erstellen. Entweder durch den Einsatz von <p:declare-step> oder durch <p:pipeline>.

p:declare-step

Mit Hilfe von <p:declare-step> werden Pipelines (oder Steps) angelegt.

<p:declare-step
 name? = NCName
 type? = QName
 psvi-required? = boolean
 xpath-version? = string
 exclude-inline-prefixes? = prefix list
 version? = string>
  (p:input |
   p:output |
   p:option |
   p:log |
   p:serialization)*,
  ((p:declare-step |
   p:pipeline |
   p:import)*,
   subpipeline)?
</p:declare-step>

Wie in dem Code-Beispiel zu sehen ist, kann ein <p:declare-step> mit etlichen Einstellungen versehen werden. Das Element <p:declare-step> wird später nochmals aufgegriffen und die einzelnen Attribute werden näher erläutert. Relevant ist zunächst, dass durch das Attribut “name“ der gesamten Pipeline ein Name zugewiesen werden kann (dieser Aspekt ist wichtig für das Verknüpfen von Steps).

Im Attribut “version“ wird die aktuell eingesetzte Version von XProc eingetragen. Dies ist für den verwendeten Prozessor (z.B. Calumet) von Bedeutung.

Eine Pipeline wird in XProc wie ein Step behandelt, da sie z.B. in einer anderen Pipeline ebenfalls als Step in Erscheinung treten kann.

Beispiel

Im folgenden Beispiel wird eine triviale Pipeline mit Hilfe von <p:declare-step> angelegt.

<?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:output port="result" sequence="true"/>
  <p:identity/>
</p:declare-step>

Zunächst werden die beiden XProc-Namensräume mit ihren Prefixen “p:“ und “c:“ angelegt. Im Attribut “version“ wird der Wert “1.0“ angegeben. Es wird also XProc mit der Versionsnummer 1.0 verwendet. Abschliessend wird der Pipeline ein Name “TestPipeline“ zugewiesen. Nach der Angabe eines Input- und Output-Ports jeweils mit dem Attribut “sequence=true“.

Ist “sequence“ nicht “true“, würde ein Fehler in der gezeigten Pipeline entstehen. Eine Sequence bedeutet, dass mehrere Dokumente (oder auch keine) am jeweiligen Input- bzw. Output-Port geladen werden können. Steht der Wert auf “false“, wird genau ein Dokument erwartet. Im Beispiel wird nichts geladen, so würde bei “sequence=false“ ein Fehler entstehen. Per Default steht dieser Wert auf “false“, muss also explizit auf “true“ geschaltet werden.

Danach wird ein <p:identity>-Step ausgeführt. Somit ist eine Pipeline erfolgreich beschrieben worden. Als Resultat wird lediglich der Inhalt vom Input-Port (im Beispiel also nichts) ausgegeben. In der vorliegenden Arbeit wurden fast alle Pipelines ausschließlich mit <p:declare-step> definiert.

p:pipeline

Durch <p:pipeline> können Pipelines in XProc angelegt werden.

<p:pipeline
  name? = NCName
  type? = QName
  psvi-required? = boolean
  xpath-version? = string
  exclude-inline-prefixes? = prefix list
  version? = string>
  (p:input |
     p:output |
    p:option |
    p:log |
    p:serialization)*,
  (p:declare-step |
    p:pipeline |
    p:import)*,
    subpipeline
</p:pipeline>

Auf den ersten Blick wirkt <p:pipeline> baugleich zu <p:declare-step>, da es die gleichen Attribute und Angaben besitzt. Der Unterschied zu <p:declare-step> ist, dass <p:pipeline> automatisch einen primären Input-Port namens “source“, einen Parameter-Port namens “parameter“ und einen primären Output-Port namens “result“ mitbringt. Diese müssen also nicht mehr manuell angegeben werden. Da diese Ports von den meisten Steps benötigt werden, ist es also eine Erleichterung (da weniger Schreibarbeit zu tätigen ist).

Beispiel

Im folgenden Beispiel wird dieselbe triviale Pipeline aus dem vorherigen Beispiel (siehe <p:declare-step>) mit Hilfe von <p:pipeline> angelegt.

<?xml version="1.0" encoding="UTF-8"?>
<p:pipeline xmlns:p="http://www.w3.org/ns/xproc" xmlns:c="http://www.w3.org/ns/xproc-step" version="1.0" name="TrivialePipeline">
  <p:identity/>
</p:pipeline>

Da es bei <p:pipeline> nicht notwendig ist, die Standard-Ports zu definieren, reicht die Angabe des gewünschten Steps (<p:identity>) aus. Allerdings benötigt diese Variante einen Input (also z.B. ein Dokument), da die vordefinierten Ports von <p:pipeline> den Wert “sequence“ auf “false“ stehen haben. Dies würde bei einigen Prozessoren ansonsten zu einem Fehler führen (bei “sequence=false“ wird genau ein Dokument erwartet).

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