XProc-Steps

A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

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>

Im vorliegenden 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“ 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 schon 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>
Tipp der data2type-Redaktion:
Zum Thema XProc bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an: