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.
In den folgenden Unterkapiteln werden die wesentlichen Compound Steps vorgestellt und jeweils anhand eines Beispiels verdeutlicht.
<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) addressiert. 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 das 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 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“ von 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 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 Multicontainer 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 >> |