Compound Steps
Compound Steps (Zusammengefasste Schritte) beinhalten Subpipelines. Mit ihnen sind u.a. Verschachtelungen möglich. Eine Subpipeline kann beliebig viele weitere Subpipelines enthalten.
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: |