Home
Über mich
Blog
Veröffentlichungen
IT-Trainings
Impressum


XML: Processing Instructions

Zusammenfassung:

Speziell bei komplexen XML-Konvertierungsstrecken ist es oft erforderlich, XML-Dokumente mit temporären Zusatzinformationen zu versehen, die bei der Weiterverarbeitung benötigt werden, z.B. Headerinformationen, Verweise und Bezüge zu anderen Dokumenten, Empfängeradressen u.v.a.m., die aber nicht Bestandteile des XML Dokuments werden sollen.

XML: Processing Instructions

Da das XML Dokument selbst inhaltlich nicht verändert werden darf (Dokumentschutz) oder bei der XML Schema-Validierung ggf. auf einen Fehler laufen würde, behilft man sich oft damit, die Zusatzinformationen vor den Root-Node zu setzen. Dadurch verliert das XML-Dokument seine Wohlgeformtheit. Im weiteren Konvertierungsprozeß müssen daher jene Zusatzinformationen erst wieder entfernt werden, damit das XML Dokument wieder wohlgeformt und valide ist und regulär verarbeitet werden kann.

Processing Instructions machen diese Datenschnippelei durch externe Programme überflüssig. Mit ganz legalen Mitteln können einem XML Dokument Zusatzinformationen mitgegeben und später ausgelesen werden, ohne das Dokument wiederholt verändern und die Wohlgeformtheit gefährden zu müssen.

<xsl:processing-instruction 
  name="receiver">info10@wilfried-grupe.de</xsl:processing-instruction>

erzeugt folgenden Aufruf:

<?receiver info10@wilfried-grupe.de?>

PI's gehören selbst nicht zum XML Dokument. Auch wenn sie optisch ähnlich aussehen mögen wie Attribute oder Prologe, so haben sie damit nichts zu tun. XML Prozessoren ignorieren die PI's und leiten den Inhalt weiter. Um die PI's in XSLT wieder auslesen zu können, kann der Nodetest processing-instruction() verwendet werden.

<?receiver info10@wilfried-grupe.de?> <Books/> 

Die Auswertung der PI ist in XSLT dann ganz einfach:

<xsl:value-of select="/processing-instruction('receiver')"/>

Der Output ist dann

info10@wilfried-grupe.de

Processing Instructions sind in der XML Specification https://www.w3.org/TR/REC-xml/#sec-pi näher erläutert: "Processing instructions (PIs) allow documents to contain instructions for applications. ... PI's are not part of the document's character data, but MUST be passed through to the application."

Zahlreiche Anwendungen arbeiten mit diesem Konzept. Beeindruckend finde ich die Umsetzung in den XSLTForms, die clientseitig XForms mit XSLT kombinieren. Der Besuch von http://www.agencexml.com/xsltforms.htm, das Nachvollziehen der dort aufgeführten Beispiele sowie die ergänzenden Erläuterungen in https://en.wikibooks.org/wiki/Category:XSLTForms kann ich nur empfehlen.

<?xml-stylesheet href="xsltforms/xsltforms.xsl" type="text/xsl"?>
<?xsltforms-options debug="yes"?>

Siehe auch http://www.w3schools.com/xsl/el_processing-instruction.asp

Verwendung finden die PI's nicht zuletzt auch in der Verlagsbranche, etwa Zeitungsverlagen, wo bestimmte Platzhalter (Reiter, Dachzeile, Hauptzeile, Titel, Bildunterzeile, Quelle, Bildergalerie, Schlagwort, Vorspann, Autor) bereitgestellt werden, die im weiteren Konvertierungsverlauf verwendet werden. Eine Variante ist, diese Platzhalter durch Processing-instructions zu definieren, die im Input-Text an verschiedenen Stellen auftauchen können.

Einen Überblick über die verwendeten Processing-instructions eines XML Dokuments kann man durch folgendes XSL gewinnen:

<xsl:stylesheet version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" />
  <xsl:template match="/">
    <root>
      <xsl:for-each
        select="descendant::*/processing-instruction()">
        <pi>
          <xsl:value-of select="name()" />|<xsl:value-of select="." />
        </pi>
      </xsl:for-each>
    </root>
  </xsl:template>
</xsl:stylesheet>

Soll der Name der Processing-Instruction selbst zu einem Element im Zieldokument werden, andere Elemente jedoch erhalten bleiben, so empfiehlt sich folgender Ansatz:

  <xsl:template match="p | stichwort | foto-quelle">
    <xsl:element name="{name()}">
      <xsl:apply-templates />
    </xsl:element>
  </xsl:template>
  <xsl:template match="processing-instruction()">
    <xsl:element name="{name()}">
      <xsl:value-of select="."></xsl:value-of>
    </xsl:element>
  </xsl:template>
  <xsl:template match="/">
    <erg>
      <xsl:apply-templates />
    </erg>
  </xsl:template>

qrpic/processinginstructions.jpg

wg / 14. Oktober 2017




Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf (info10@wilfried-grupe.de).



Vielen Dank für Ihr Interesse an meiner Arbeit.


V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

Mobil: 0151. 750 360 61 * eMail: info10@wilfried-grupe.de