Atomic Steps

Ein atomarer Schritt führt eine einzige Operation aus. Er beinhaltet keine internen “Subpipelines“ bzw. weiterführende Schritte, sondern führt einfache Aktionen aus.

Abbildung Atomic Steps

Abb. Atomic Steps

Die wesentlichen Atomic Steps

Hier werden die wesentlichen Atomic Steps von XProc vorgestellt und jeweils anhand eines Beispiels erläutert.

p:identity

<p:declare-step type="p:identity">
   <p:input port="source" sequence="true"/>
   <p:output port="result" sequence="true"/>
</p:declare-step>

Der <p:identity>-Step macht eine direkte Kopie des Eingangsdokuments bzw. des Inputs am Eingangsport (“source“) und gibt diesen am Ouput-Port (“result“) wieder aus.

Beispiel

Das folgende Skript gibt den kompletten Inhalt des Eingangsports direkt wieder aus.

<?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:identity/>
</p:declare-step>

p:xslt

<p:declare-step type="p:xslt">
   <p:input port="source" sequence="true" primary="true"/>
   <p:input port="stylesheet"/>
   <p:input port="parameters" kind="parameter"/>
   <p:output port="result" primary="true"/>
   <p:output port="secondary" sequence="true"/>
   <p:option name="initial-mode"/> <!-- QName -->
   <p:option name="template-name"/> <!-- QName -->
   <p:option name="output-base-uri"/> <!-- anyURI -->
   <p:option name="version"/> <!-- string --> 
</p:declare-step>

Mit Hilfe des Steps <p:xslt> können XSLT-Transformationen durchgeführt werden. Er besitzt drei Input-Ports, welche das einzulesende Dokument, das zu transformierende XSLT-Stylesheet und die optionalen Parameter angeben. Weiterhin hat der Step zwei Output-Ports. Der Primary-Output (“result“) liefert das primäre Ergebnis der jeweiligen Transformation, der zweite Output-Port (“secondary“) gibt alle anderen Ausgabedokumente aus (falls welche erzeugt wurden). Weiterhin stehen noch Optionen zur Verfügung. So kann der Benutzer unter “inital-mode“ eine Angabe machen, die das Verhalten der Transformation beeinflusst. Dieser Modus muss allerdings im zugrundeliegenden XSLT-Stylesheet definiert worden sein. Unter “template-name“ kann der Name eines Named Templates im XSLT-Stylesheet angegeben werden. Das bedeutet, dass die Transformation mit diesem Template beginnt. Durch “output-base-uri“ ist es möglich, eine Angabe zur Ausgabe der XSLT-Transformation im Dateisystem zu geben. “Version“ gibt die zu verwendende XSLT-Version an (1.0 oder 2.0). Sämtliche Optionen sind optional.

Beispiel

Es soll ein XSLT-Stylesheet ausgeführt werden, welches die einzulesende Datei in eine XHTML-Seite mit Angabe der Filmtitel in eine Liste umwandelt.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl" version="2.0">
  <xsl:output method="xhtml"/>
  <xsl:template match="/">
    <html>
      <body>
        <h1>Filmliste</h1>
        <ul>
          <xsl:apply-templates select="//Titel"/>
        </ul>
      </body>
    </html>
  </xsl:template>
  <xsl:template match="Titel">
    <li>
      <xsl:value-of select="."/>
    </li>
  </xsl:template>
</xsl:stylesheet>

Das in der Abbildung gezeigte XSLT-Stylesheet erzeugt anhand der Beschaffenheit der eingelesenen XML-Datei eine XHTML-Seite, die eine unsortierte Liste mit den jeweiligen Filmtiteln erstellt. Dieses Stylesheet soll nun Teil des XProc-Dokuments 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:document>
 </p:input>
 <p:output port="result"/>
 <p:xslt>
   <p:input port="stylesheet">
     <p:document href="xslt_stylesheet.xsl"></p:document>
   </p:input>
   <p:input port="parameters">
     <p:empty/>
   </p:input>
 </p:xslt>
</p:declare-step>

Im Step <p:xslt> werden die benötigten Input-Ports definiert. So wird im Port “stylesheet“ via <p:document> das einzulesende XSLT-Stylesheet angegeben. Im Beispiel wird angenommen, dass die Dateien alle im selben Verzeichnis liegen. Da dem Stylesheet keine Parameter mitgegeben werden, muss dies durch <p:empty> klar angegeben werden (dies würde sonst zu einem “dynamic error“ führen).

Das Resultat der Transformation sieht folgendermaßen aus:

<html xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl">
 <body>
   <h1>Filmliste</h1>
   <ul>
     <li>Star Wars: Episode IV - A New Hope</li>
     <li>Eraserhead</li>
     <li>Unforgiven</li>
   </ul>
 </body>
</html>

p:filter

<p:declare-step type="p:filter">
   <p:input port="source"/>
   <p:output port="result" sequence="true"/>
   <p:option name="select" required="true"/> <!-- XPathExpression -->
</p:declare-step>

Der Filter-Port hat im Wesentlichen dieselbe Funktionalität wie der Input-Port. Der entscheidende Unterschied ist, dass durch einen entsprechenden XPath-Ausdruck der einzulesende Inhalt genau definiert bzw. gefiltert werden kann.

Beispiel

Im folgenden Beispiel werden sämtliche Titel-Elemente aus dem Eingangsdokument herausgefiltert.

<?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:filter select="/FilmSammlung/Film/Titel"/>
</p:declare-step>

Im Attribut “select“ wird der XPath-Ausdruck angegeben. Der boolsche Wert im href-Attribut “sequence“ von <p:output> sollte auf “true“ gesetzt werden, da XPath-Ausdrücke in der Regel mehrere Ausgabedokumente produzieren (für jeden Treffer ein Dokument).

Folgende Ausgabe wird vom XProc-Prozessor produziert:

<Titel>Star Wars: Episode IV - A New Hope</Titel>
<Titel>Eraserhead</Titel>
<Titel>Unforgiven</Titel>

p:compare

<p:declare-step type="p:compare">
   <p:input port="source" primary="true"/>
   <p:input port="alternate"/>
   <p:output port="result" primary="false"/>
   <p:option name="fail-if-not-equal" select="'false'"/> <!-- boolean -->
</p:declare-step>

Der <p:compare>-Step vergleicht zwei Dokumente auf ihre “Gleichheit“. Sind beide Dokumente identisch, wird der boolsche Wert “true“ als Rückgabewert ausgegeben, ansonsten “false“.

Beispiel

Im Beispiel werden zwei Dokumente miteinander verglichen.

<?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" name="Pipeline">
  <p:input port="source">
    <p:document href="filmsammlung.xml"/>
  </p:input>
  <p:input port="alternate">
    <p:document href="filmsammlung_2.xml"/>
  </p:input>
  <p:output port="result"/>
  <p:compare name="Vergleiche" fail-if-not-equal="false">
    <p:input port="source">
      <p:pipe port="source" step="Pipeline"/>
    </p:input>
    <p:input port="alternate">
      <p:pipe port="alternate" step="Pipeline"/>
    </p:input>
  </p:compare>
  <p:identity>
    <p:input port="source">
      <p:pipe port="result" step="Vergleiche"/>
    </p:input>
  </p:identity>
</p:declare-step>

In diesem Beispiel werden die Dokumente “filmsammlung.xml“ und “filmsammlung_2.xml“ miteinander verglichen. Der Pipeline wird im Wurzelelement <p:declare-step> ein Name übergeben (“Pipeline“), um sie später mit den entsprechenden Ports im <p:compare>-Step verbinden zu können. Der <p:compare>-Step bekommt den String “Vergleiche“ als Namen zugewiesen und “fail-if-not-equal“ ist auf “false“ gesetzt. Dies hat zur Folge, dass als Resultat entweder “true“ oder “false“ ausgegeben wird. Ansonsten würde ein dynamischer Fehler (bei ungleichen Dokumenten) vom XProc-Prozessor ausgegeben werden.

Die beiden Input-Ports innerhalb von <p:compare> werden, wie eingangs bereits erläutert, mit den äußeren “Input Ports“ via <p:pipe> verbunden. Um dies zu realisieren, benötigt das Attribut “step“ den Namen des zu verknüpfenden Steps (im Beispiel also “Pipeline“). Da <p:compare> nun mit den entsprechenden Dokumenten versorgt wird, kann der Prozess durchgeführt werden. Das Ergebnis wird von <p:identity> gelesen und ausgegeben.

Im Falle eines Unterschieds unter den Dokumenten würde das Resultat folgendermaßen aussehen:

<c:result>false</c:result>

p:directory-list

<p:declare-step type="p:directory-list">
   <p:output port="result"/>
   <p:option name="path" required="true"/> <!-- anyURI -->
   <p:option name="include-filter"/> <!-- RegularExpression -->
   <p:option name="exclude-filter"/> <!-- RegularExpression -->
</p:declare-step>

Durch <p:directory-list> ist es möglich, den Inhalt eines Verzeichnisses innerhalb des Dateisystems auslesen zu lassen. Durch die Option “path“ wird das gewünschte Verzeichnis angegeben. Falls der Prozessor beim Auswerten das Verzeichnis nicht findet, wird ein dynamischer Fehler ausgegeben. Weiterhin ist es möglich, Filterregeln zu definieren. Diese müssen einen regulären Ausdruck gemäß der XPath 2.0-Regeln beinhalten. Durch “include-filter“ ist es möglich, festzulegen, was genau ausgegeben werden soll. Analog dazu ist es mit “exclude-filter“ möglich, zu definieren, was nicht angezeigt werden soll.

Beispiel

Im folgenden Beispiel soll das aktuelle Verzeichnis (“.“) ausgelesen 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:input>
  <p:output port="result"/>
  <p:directory-list path="."/>
</p:declare-step>

Die Ausgabe sieht so aus:

<c:directory name="directory" xml:base="file:../Bachelorarbeit/Quellcodes/directory/">
 <c:file name="directory.xpl"/>
 <c:file name="file.xml"/>
 <c:file name="file2.xml"/>
 <c:file name="file3.txt"/>
 <c:file name="file4.doc"/>
</c:directory>

Angenommen der Benutzer möchte nur Dateien mit der Endung “*.txt“ ausgegeben bekommen, so muss dem Element <p:directory> noch eine Filter-Option als Attribut mitgegeben werden:

<p:directory-list include-filter=".*txt" path="."/>

Folglich würde die Ausgabe so aussehen:

<c:directory name="directory" xml:base="file:../Bachelorarbeit/Quellcodes/directory/">
 <c:file name="file3.txt"/>
</c:directory>

Möchte der Benutzer sämtliche Dateien mit der Endung “*.txt“ von der Ausgabe ausschließen, so muss die Filterregel angepasst werden:

<p:directory-list exclude-filter=".*txt" path="."/>

Das Resultat würde in diesem Fall so aussehen:

<c:directory name="directory" xml:base="file:/Users/tg/Documents/FH%20Worms/6_Semester/Bachelorarbeit/Quellcodes/directory/">
 <c:file name="beispiel_14b_directory.xpl"/>
 <c:file name="file.xml"/>
 <c:file name="file2.xml"/>
 <c:file name="file4.doc"/>
</c:directory>

Werden beide Varianten als Filterregeln verwendet, so wird zuerst die “include-filter“- und danach die “exclude-filter“-Regel durchgeführt.

p:load

<p:declare-step type="p:load">
   <p:output port="result"/>
   <p:option name="href" required="true"/> <!-- anyURI -->
   <p:option name="dtd-validate" select="'false'"/> <!-- boolean -->
</p:declare-step>

Der Step <p:load> ist der Funktionalität von <p:document> sehr ähnlich. Beide laden externe Dokumente ein bzw. akzeptieren entsprechende URIs oder inline erstellte Dokumente. Der primäre Unterschied ist, dass <p:document> ein XProc-Pipeline-Element ist und <p:load> ein Step. Das bedeutet, er kann im Stylesheet an anderen Stellen auftreten als <p:document> es kann. Weiterhin unterstützt der Step eine Validierung gegen eine DTD (insofern sie im einzuladenden Dokument hinterlegt ist). Ist die DTD invalide oder nicht vorhanden, wird ein dynamischer Fehler ausgegeben.

Beispiel

Im folgenden Beispiel wird die trivialste Verwendungsmöglichkeit von <p:load> gezeigt.

<?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:output port="result"/>
  <p:load href="filmsammlung.xml"/>
</p:declare-step>

p:make-absolute-uris

<p:declare-step type="p:make-absolute-uris">
   <p:input port="source"/>
   <p:output port="result"/>
   <p:option name="match" required="true"/> <!-- XSLTMatchPattern -->
   <p:option name="base-uri"/> <!-- anyURI -->
</p:declare-step>

Der Step <p:make-absolute-uris> erstellt absolute Links vom Inhalt, der durch einen entsprechenden XSLT-Ausdruck angegeben wird. Die Option “base-uri“ gibt dem Benutzer die Möglichkeit, eine Basis-URL anzugeben. Allen Einträgen, die in einen absoluten Pfad umgewandelt werden, wird dann dieser Wert vorangestellt.

Beispiel

Im folgenden Beispiel sollen sämtliche Regisseure zu absoluten URIs mit der Basis-Adresse "http://www.fh-worms.de" umgewandelt 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:make-absolute-uris base-uri="http://www.fh-worms.de/" match="/FilmSammlung/Film/Regisseur"/>
</p:declare-step>

Das Resultat dieses Prozesses sieht folgendermaßen aus (Auszug):

<FilmSammlung>
  <Film>
    <Titel>Star Wars: Episode IV - A New Hope</Titel>
    <Jahr>1978</Jahr>
    <Genre>SciFi</Genre>
    <Regisseur>http://www.fh-worms.de/George%20Lucas</Regisseur>
    <Produzent>George Lucas</Produzent>
    <Cast>
[...]

p:exec

<p:declare-step type="p:exec">
   <p:input port="source" primary="true" sequence="true"/>
   <p:output port="result" primary="true"/>
   <p:output port="errors"/>
   <p:output port="exit-status"/>
   <p:option name="command" required="true"/> <!-- string -->
   <p:option name="args" select="''"/> <!-- string -->
   <p:option name="cwd"/> <!-- string -->
   <p:option name="source-is-xml" select="'true'"/> <!-- boolean -->
   <p:option name="result-is-xml" select="'true'"/> <!-- boolean -->
   <p:option name="wrap-result-lines" select="'false'"/> <!-- boolean -->
   <p:option name="errors-is-xml" select="'false'"/> <!-- boolean -->
   <p:option name="wrap-error-lines" select="'false'"/> <!-- boolean -->
   <p:option name="path-separator"/> <!-- string -->
   <p:option name="failure-threshold"/> <!-- integer -->
   <p:option name="arg-separator" select="' '"/> <!-- string -->
   <p:option name="byte-order-mark"/> <!-- boolean -->
   <p:option name="cdata-section-elements" select="''"/> <!-- ListOfQNames -->
   <p:option name="doctype-public"/> <!-- string -->
   <p:option name="doctype-system"/> <!-- anyURI -->
   <p:option name="encoding"/> <!-- string -->
   <p:option name="escape-uri-attributes" select="'false'"/> <!-- boolean -->
   <p:option name="include-content-type" select="'true'"/> <!-- boolean -->
   <p:option name="indent" select="'false'"/> <!-- boolean -->
   <p:option name="media-type"/> <!-- string -->
   <p:option name="method" select="'xml'"/> <!-- QName -->
   <p:option name="normalization-form" select="'none'"/> <!-- NormalizationForm -->
   <p:option name="omit-xml-declaration" select="'true'"/> <!-- boolean -->
   <p:option name="standalone" select="'omit'"/><!-- "true" | "false" | "omit" -->
   <p:option name="undeclare-prefixes"/> <!-- boolean -->
   <p:option name="version" select="'1.0'"/> <!-- string -->
</p:declare-step>

Der <p:exec>-Step ermöglicht das Ausführen von externen Befehlen/Programmen auf der Kommandozeile des jeweiligen Betriebssystems. Die Inhalte am Input-Port (“source“) werden dem jeweiligen Aufruf übergeben. Das Programm, welches ausgeführt werden soll, wird durch die Option “command“ definiert. Die Option erwartet einen String, welcher den jeweiligen Befehlsaufruf enthält. Unter der Option “args“ können Parameter angegeben werden, die das Verhalten des aufzurufenden Programms beeinflussen können. Ein klassischer Parameter ist zum Beispiel “-h“, welcher üblicherweise die Hilfe ausgibt. Mehrere Parameter werden durch ein Leerzeichen angegeben. Dieses Trennzeichen kann aber auch frei unter “arg-seperator“ definiert werden. Durch die Option “cwd“ (“Current Working Directory“) kann der Benutzer den Pfad im Dateisystem angeben, wo sich das aufzurufende Programm befindet. Falls das Programm nicht gefunden werden kann, wird ein dynamischer Fehler ausgegeben. Wird diese Option nicht bedient, ist der Wert standardmäßig der Ort im Dateisystem, wo sich das auszuführende Programm befindet. Die boolschen Optionen “source-is-xml“ und “result-is-xml“ teilen dem Prozessor mit, ob entweder die Eingabeinformationen oder Ausgabeinformationen XML-basiert sind oder nicht. Sind die Optionen “wrap-result-lines“ oder/und “wrap-error-lines“ auf “true“ gesetzt, so werden sämtliche Zeilen der Ausgabeinformationen mit einem <c:line>-Element umschlossen.

Falls die Option “output-is-xml“ ebenfalls auf “true“ steht, wird ein dynamischer Fehler ausgegeben. Die Option “path-seperator“ gibt an, wie das Zeichen für eine Trennung von Pfaden im Dateisystem auszusehen hat. Kommt dieses Zeichen bei den Angaben von “command“, “args“ oder “cwd“ vor, so wird es durch das jeweilige dem Betriebssystem anhängige Pfadtrennungszeichen ersetzt. Es stehen noch weitere Optionen zur Verfügung, welche genauere Angaben über die Beschaffenheit der einzulesenden Daten (z.B. welcher Art sie sind, unter der Option “media-type“) und deren Verarbeitungsvorgaben (z.B. ob die Ausgabedaten eingerückt werden sollen, unter “indent“) ermöglichen. Da diese Optionen stark fallbasiert und für die primäre Bedeutung des Steps unerheblich sind, wird auf diese nicht weiter eingegangen.

Der Step verfügt weiterhin über drei Output-Ports. Der primäre Output-Port “result“ gibt das Ergebnis des ausgeführten Programms aus. Im Output-Port “errors“ sind eventuell aufgetretene Fehler aufgelistet, also die Ausgaben, die auf der Kommandozeile auf die Standard-Fehlerausgabe geschrieben werden. Der Port “exit-status“ gibt immer einen Integer-Wert aus, der Rückschluss über das erfolgreiche Ausführen des Befehls gibt. So ist bei einem Erfolg der Wert <c:result>0</result> zu lesen und bei Fehlern <c:result>1</c:result>

Beispiel

Im folgenden Beispiel soll der Unix-Befehl “cat“ ausgeführt werden. Er soll das Dokument “filmsammlung.xml“ ausgeben.

<?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" name="testpipe">
  <p:input port="source">
    <p:document href="filmsammlung.xml"/>
  </p:input>
  <p:output port="result" sequence="true">
    <p:empty/>
  </p:output>
  <p:exec command="cat" result-is-xml="true" name="exec"/>
  <p:identity>
    <p:input port="source">
      <p:pipe port="errors" step="exec"/>
    </p:input>
  </p:identity>
  <p:store href="fehler.xml"/>
  <p:identity>
    <p:input port="source">
      <p:pipe port="exit-status" step="exec"/>
    </p:input>
  </p:identity>
  <p:store href="exit_status.xml"/>
  <p:identity>
    <p:input port="source">
      <p:pipe port="result" step="exec"/>
    </p:input>
  </p:identity>
  <p:store href="resultat.xml"/>
</p:declare-step>

Die drei Output-Ports werden jeweils von einem <p:identity>-Step abgefangen und via <p:store> in eine Datei gespeichert. Das Resultat sieht folgendermaßen aus (Auszug):

<c:result>
 <FilmSammlung>
   <Film>
    <Titel>Star Wars: Episode IV - A New Hope</Titel>
    <Jahr>1978</Jahr>
    <Genre>SciFi</Genre>
[...]

Da der Prozess erfolgreich durchgeführt wurde, erfolgt keine Ausgabe am Port “errors“. Die erstellte Datei “fehler.xml“ hat also keinen Inhalt. Im Port “exit-status“ wird dementsprechend <c:result>0</c:result> ausgegeben (was dem Inhalt von “exit-status.xml“ entspricht).

p:store

<p:declare-step type="p:store">
   <p:input port="source"/>
   <p:output port="result" primary="false"/>
   <p:option name="href" required="true"/> <!-- anyURI -->
   <p:option name="byte-order-mark"/> <!-- boolean -->
   <p:option name="cdata-section-elements" select="''"/> <!-- ListOfQNames -->
   <p:option name="doctype-public"/> <!-- string -->
   <p:option name="doctype-system"/> <!-- anyURI -->
   <p:option name="encoding"/> <!-- string -->
   <p:option name="escape-uri-attributes" select="'false'"/> <!-- boolean -->
   <p:option name="include-content-type" select="'true'"/> <!-- boolean -->
   <p:option name="indent" select="'false'"/> <!-- boolean -->
   <p:option name="media-type"/> <!-- string -->
   <p:option name="method" select="'xml'"/> <!-- QName -->
   <p:option name="normalization-form" select="'none'"/> <!-- NormalizationForm -->
   <p:option name="omit-xml-declaration" select="'true'"/> <!-- boolean -->
   <p:option name="standalone" select="'omit'"/> <!-- "true"|"false"|"omit" -->
   <p:option name="undeclare-prefixes"/> <!-- boolean -->
   <p:option name="version" select="'1.0'"/> <!-- string -->
</p:declare-step>

Mit Hilfe von <p:store> können die eingehenden Dokumentinformationen in einen URI gespeichert werden. Die Angabe des “href“-Werts ist als “anyURI“ ausgewiesen, was bedeutet, dass der Benutzer freie Wahl bei der Bezeichnung des Ziels hat (i.d.R ein Dokumentname). Da <p:store> keinen primären Output-Port hat, muss dieser zwingend beim Anlegen definiert werden. Die anderen Optionen sind allesamt optional.

Beispiel

Im folgenden Beispiel wird der eingelesene Input in eine XML-Datei (“ausgabe.xml“) geschrieben.

<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:document>
 </p:input>
 <p:output port="result"><p:empty/></p:output>
 <p:store href="ausgabe.xml"></p:store>
</p:declare-step>

Das Dokument “ausgabe.xml“ wird im selben Verzeichnis erzeugt, wo sich das XProc-Stylesheet befindet.

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