Compound Steps

Compound Steps (Zusammengefasste Schritte) beinhalten Subpipelines. Mit ihnen sind u.a. Verschachtelungen möglich. Eine Subpipeline kann beliebig viele weitere Subpipelines enthalten.

Beispiel eines Compound Steps

Abb. Beispiel eines Compound Steps

Anstelle eines Atomic Steps, wie in der Abbildung gezeigt, könnte auch ein weiterer Compound Step vorkommen. Also eine weitere vollständige Pipeline.

Die wesentlichen Compound Steps

Im Folgenden werden die wesentlichen Compound Steps vorgestellt und jeweils anhand eines Beispiels verdeutlicht.

p:for-each

<p:for-each name? = NCName>
  ((p:iteration-source? &
   (p:output |
   p:log)*),
  subpipeline)
</p:for-each>

Der <p:for-each>-Step stellt eine Schleifenimplementierung unter XProc dar. So werden Dokumente, die diesem Step zugewiesen werden, innerhalb einer Schleife, der Reihe nach, in einer Subpipeline verarbeitet. Der Input muss von einem vorherigen Step als Sequenz bereitgestellt werden (also mehrere Dokumente beinhalten). Alternativ kann auch durch <p:iteration-source> der Inhalt bereitgestellt werden.

<p:iteration-source select? = XPathExpression>
   (p:empty |
   (p:pipe |
   p:document |
   p:inline |
   p:data)+)?
</p:iteration-source>

<p:iteration-source> steht nur in <p:for-each> zur Verfügung. Als Attribut kann ein XPath-Ausdruck übergeben werden, der gewünschte Inhalte aus dem initalen Dokument (vom Input-Port) adressiert. Alternativ können auch Inhalte über <p:document>, <p:inline> und <p:data> geladen bzw. kreiert werden. Die eingelesenen Dokumente werden dann in der Subpipeline sukzessive verarbeitet.

Beispiel

Im folgenden Beispiel wird die Funktionalität des <p:for-each>-Steps demonstriert.

<?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" sequence="true"/>
  <p:for-each>
    <p:iteration-source select="//Jahr"/>
    <p:output port="result"/>
    <p:rename match="/Jahr" new-name="Datum"/>
  </p:for-each>
</p:declare-step>

Die zu verarbeitenden Daten werden durch den <p:iteration-source>-Step definiert. Er besagt, dass sämtliche “Jahr“-Elemente des eingelesenen Quelldokuments schleifenweise verarbeitet werden sollen. Diese werden nacheinander an den <p:rename>-Step gesendet. Dieser benennt das Element in “Datum“ um.

p:viewport

<p:viewport
  name? = NCName
  match = XSLTMatchPattern>
  ((p:viewport-source? &
   p:output? &
   p:log?),
  subpipeline)
</p:viewport>

Durch den <p:viewport>-Compound Step lassen sich bestimmte Teile eines Dokuments durch einen entsprechenden XSLT-Ausdruck selektieren, um diese dann in einer Subpipeline verarbeiten zu können. Alternativ kann auch durch <p:viewport-source> der gewünschte Inhalt bereitgestellt werden.

<p:viewport-source>
   (p:pipe |
   p:document |
   p:inline |
   p:data)?
</p:viewport-source>

<p:viewport-source> steht nur als Teil von <p:viewport> zur Verfügung. Es muss hier zwingend ein Dokument angegeben werden. Dies kann durch die Elemente <p:pipe>, <p:document>, <p:inline> oder <p:data> realisert werden. Ist kein Dokument angegeben, wird ein dynamischer Fehler erzeugt.

Beispiel

Im folgenden Beispiel soll nur ein Teil des Dokuments verarbeitet werden.

<?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:viewport match="/FilmSammlung/Film/Titel">
    <p:wrap match="/" wrapper="test"></p:wrap>
  </p:viewport>
</p:declare-step>
 

Der XSLT-Ausdruck im Attribut “match“ vom Step <p:viewport> adressiert sämtliche “Titel“-Elemente vom Quelldokument. Dieser Teil des Dokuments wird nun in die Subpipeline von <p:viewport>, im Beispiel lediglich der Step <p:wrap>, weitergeleitet. Dort werden sämtliche “Titel“-Elemente in “test“ umbenannt.

p:group

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

<p:group> ist ein sogenannter Wrapper für eine Ansammlung mehrerer Steps. Er fasst sie zusammen. Er ist beispielsweise im Multi-Container Step <p:try> verpflichtend innerhalb des try-Bereichs anzuwenden.

Beispiel

Im folgenden Beispiel wird ein <p:group>-Step demonstriert.

<?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:empty/>
 </p:input>
 <p:output port="result"/>
 <p:group>
  <p:identity>
   <p:input port="source">
    <p:inline>
     <doc>Beispiel</doc>
    </p:inline>
   </p:input>
  </p:identity>
 </p:group>
 <p:identity/>
</p:declare-step>

Im vorliegenden Beispiel wird der <p:identity>-Step mit einem <p:group>-Element umschlossen. Der gezeigte Quelltext soll lediglich die Anwendung des Steps zeigen.

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