Ports

Ports sind Anschlüsse, welche die Ein- und Ausgänge von Pipelines und deren Steps bereitstellen. Sie sind als Input- für Eingänge und Output-Ports für Ausgänge zu bezeichnen. Ports müssen benannt werden. Es existieren einige per Konvention vorgeschriebene Bezeichnungen. Die häufigsten davon sind “source“ und “result“. Bei den sogenannten “Built-In“-Steps sind diese Kennzeichnungen oft Pflicht und führen bei Nichteinhaltung zu entsprechenden Fehlern. Die folgende Grafik soll das Konzept von Ports verdeutlichen:

 

Abbildung XProc-Ports

Abb. XProc-Ports

Um nicht für jeden Step einen eigenen Port definieren zu müssen, existieren Primary Ports. Dabei handelt es sich um einen Standard-Port, auf den der jeweilige Step automatisch seinen Input empfängt und Output produziert.

p:input

<p:input
   port = NCName
   sequence? = boolean
   primary? = boolean
   kind? = "document"
   select? = XPathExpression>
  (p:empty |
     (p:document |
     p:inline |
     p:data)+)?
</p:input>

Mittels <p:input> wird ein Input-Port definiert. Dem Attribut “port“ wird der entsprechende Name des Ports zugewiesen. In der Regel die durch Konventionen vorgegebenen Bezeichnungen “source“ oder “result“. Das boolsche Attribut “sequence“ ist per Default auf “false“ gesetzt. Ist “sequence“ auf “true“, also wahr, gesetzt, so wird am Input-Port eine Sequenz von Dokumenten erwartet (von Null bis zu beliebig vielen). Ist dieses Attribut “false“ und es wird eine Sequenz geladen, so führt dies unweigerlich zu einem dynamischen Fehler. Da hier genau ein Dokument erwartet wird.

Das Attribut “primary“ ist ebenfalls vom Typ boolean. Ist es auf “true“ gesetzt, so wird der Port zum primären Port geschaltet. Analog wird er ein “normaler“ Port, wenn der Wert auf “false“ steht. Standardmäßig steht dieser Wert auf “true“.

Die Angabe im Attribut “kind“ gibt an, um welche Art des Inputs es sich handelt. XProc differenziert hier zwischen zwei Angaben. Der Standard-Wert ist “document“, was bedeutet, dass der Port reguläre Dokumente empfangen und verarbeiten wird. Für den Fall, dass der Benutzer bestimmte Parameterangaben tätigen möchte, ist der Wert “parameter“ einzutragen.

Das Attribut “select“ erwartet einen XPath-Ausdruck. Hier hat der Benutzer die Möglichkeit, Teile des am Input-Port eintreffenden Dokuments (z.B. durch <p:document> oder <p:data>) zu selektieren, um dieses dann an die folgenden Steps weiterzugeben. Dies funktioniert nicht bei expliziten Verbindungsangaben (also nur bei direkten Verbindungen innerhalb des Dokuments).

Im Inneren des <p:input>-Steps müssen Dokumentangaben getätigt werden. Diese definieren, welche Dokumente zu laden sind. Dem Benutzer stehen hierbei die Elemente <p:empty>, <p:document>, <p:inline> und <p:data> zur Verfügung.

<p:input port="source">
   <p:document href="filmsammlung.xml"/>
</p:input>

Das gezeigte Beispiel stellt eine übliche Definition eines <p:input>-Ports dar. Der Port trägt den Namen “source“ und lädt das XML-Dokument “filmsammlung.xml“, was er dann an die entsprechend angeschlossenen Steps weitergibt.

<p:output
  port = NCName
  sequence? = boolean
  primary? = boolean/>

Durch <p:output> wird ein Output-Port angelegt. Er erhält durch das Attribut “port“ seine Bezeichnung. Ein per Konvention oft auftretender Name ist “result“. Namen dürfen nicht doppelt vergeben werden (dies führt zu einem “Static Error“).

Durch den boolschen Wert innerhalb des Attributs “sequence“ kann festgelegt werden, ob die Ausgabe des Ports eine Sequenz an Dokumenten ist, oder nicht. Falls also mehrere Dokumente ausgegeben werden und dieser Wert nicht auf “true“ steht, hat dies einen dynamischen Fehler zur Folge.

Im Attribut “primary“, was ebenfalls einen boolschen Wert erwartet, wird der Port entweder zu einem primären Output-Port (bei true) geschaltet oder zu einem normalen Port (bei false).

p:output

<p:output
  port = NCName
  sequence? = boolean
  primary? = boolean>
   (p:empty |
   (p:pipe |
   p:document |
   p:inline |
   p:data)+)?
</p:output>

Die Angabe eines Dokuments durch <p:document> würde den Output-Port veranlassen, dieses zu lesen und auszugeben. Analog würde der Prozessor dies auch mit <p:emtpy>, <p:inline> und <p:data> machen. Mit einem Atomic Step hingegen funktioniert dies nicht (dynamischer Fehler). Mittels <p:pipe> kann der Port auf einen Step gebunden werden.

<p:output port="result"/>

Das kurze Beispiel zeigt einen typischen Output-Port. Er trägt die Bezeichnung “result“.

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