xsl:processing-instruction

(Auszug aus "XSLT 2.0 & XPath 2.0" von Frank Bongers, Kapitel 6.)

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

 

Die Instruktion xsl:processing-instruction erzeugt im Ergebnisdokument eine Prozessanweisung (processing instruction).

Klassifizierung Instruktion
Funktionsgruppe Output im Ergebnisdokument erzeugen
Einführung XSLT 1.0

Position im Stylesheet und erlaubte Inhalte:

xsl:processing-instruction darf überall innerhalb von Template-Regeln auftreten. Die Instruktion enthält einen Templatekörper in Form eines Sequenzkonstruktors, der das Textliteral erzeugt, das den Anweisungsblock der Prozessanweisung bildet.

Attribute:

Es gelten die Standardattribute. Abgesehen von diesen besitzt die Instruktion xsl:processing-instruction ein elementspezifisches obligatorisches Attribut name. In XSLT 2.0 kommt ein zweites, optionales Attribut select hinzu.

name

Wert

{ncname} (auch als AVT)

Verwendung

obligatorisch

Einführung

XSLT 1.0

Das name-Attribut enthält den Namen der Processing-Instruction. Dieser entspricht dem Namen der angesprochenen Applikation und stellt gleichzeitig den Knotennamen dar, falls dieser mit fn:name() abgefragt würde.

Es muss sich um einen NCName (non-colonized name) handeln, der keinen Doppelpunkt enthalten darf. Aus diesem Grunde kann der Bezeichner kein QName mit Namensraumpräfix sein.

Der benötigte Wert kann zur Laufzeit mittels eines Attributwert-Templates festgelegt werden. Er muss dann allerdings eine gültige Zielanwendung (PITarget) bezeichnen. Ist dies nicht der Fall, oder wird gegen die lexikalische Form des Bezeichners verstoßen, so gilt dies als Fehler (ERR XTDE0890).

select

Wert

xpath-expression

Verwendung

optional

Einführung

XSLT 2.0

Das select-Attribut ist alternativ zu einem möglichen Sequenzkonstruktor innerhalb von xsl:processing-instruction einzusetzen. Es enthält einen XPath-Aus­druck, dessen Auswertung den Anweisungsblock der Prozessanweisung ergibt. Ist das select-Attribut gesetzt, so muss das Element leer sein, andernfalls wird ein statischer Fehler gemeldet (ERR XTSE0880).

Hinweis: Das select-Attribut existiert nicht in XSLT 1.0.

Verwendungszweck:

Die Anweisung xsl:processing-instruction erzeugt eine Prozessanweisung im Ergebnisdokument, die beliebige Befehle an eine zu nennende Zielanwendung übergibt, die das Ergebnisdokument weiterverarbeiten soll.

Der Befehl

<xsl:processing-instruction name="pi-name">anweisungen</xsl:processing-instruction>

erzeugt also (wohlbemerkt für die Ausgabemethode method="xml") eine Pro­zessanweisung der Form

<?pi-name anweisungen?>

Dieser umständlich erscheinende Weg ist erforderlich, da eine PI, wenn sie (z.B. als Literal Result Element) innerhalb des Stylesheets auftritt, ignoriert würde. Es ist daher nicht möglich, eine Processing-Instruction aus dem Stylesheet in das Ergebnisdokument zu kopieren (für eine PI im Quelldokument wäre dies jedoch mittels xsl:copy darstellbar).

Im HTML-Kontext sind Processing-Instructions gemäß Spezifikation hingegen nicht mit ?>, sondern nur mit > zu beenden. Für die Ausgabeform method="html" sieht das Ergebnis der obi­gen Anweisung korrekt wie folgt aus:

<?pi-name anweisungen>

Generierung des Anweisungsblockes der Prozessanweisung:
Aus dem Inhalt der Instruktion wird der Anweisungsblock der PI generiert. Dieser wird als Textliteral (analog zum Verhalten der Anweisung xsl:text mit disable-output-escaping="yes") in das Ergebnisdokument kopiert.

Sonderzeichen wie Tagklammern müssen im Stylesheet durch entsprechende Entitäten ersetzt werden. Im Zuge der Verarbeitung werden sie allerdings durch das bezeichnete Literal ersetzt und erscheinen im Ergebnisdokument ebenfalls in dieser Form (wäre das Output-Escaping nicht deaktiviert wäre dem nicht so):

<xsl:processing-instruction name="pi-name">if $a &lt; $b tu etwas </xsl:processing-instruction>

ergibt daher:

<?pi-name if $a < $b tu etwas ?>

Die Zeichenfolge ?&gt; darf nicht im Inneren des zu kopierenden Anweisungs­blockes auftauchen, da er im Ergebnisdokument als ?> serialisiert vorzeitig das Ende der PI signa­lisieren würde. XSLT-Prozessoren fügen daher meist zwischen Fragezeichen und Spitzklammer ein Leerzeichen ein: aus ?> wird somit ? >.

Alternativ könnte auch prozessorabhängig eine Fehlermeldung erfolgen. Sie sollten dieses Problem daher besser von vornherein vermeiden.

Keine Attribute:
Auch wenn das gewünschte Ergebnis einem Element mit Attributen optisch ähnelt, ist dies nicht wirklich der Fall – wenn es zum Beispiel so vorliegt:

<?xml-stylesheet href="mein_style.css" type="text/css?>

Es handelt sich bei diesen scheinbaren Attributen nur um Pseudoattribute, die hier als Teil des Anweisungsstrings auftauchen.

Diese müssen als Textliterale übergeben werden und können nicht z.B. mittels xsl:attribute erzeugt werden. Da eine PI kein Element darstellt, darf sie keine Attribute besitzen (es existiert ohnehin im Moment ihrer Erzeugung kein offener Elementknoten).

Nicht zum Erzeugen von XML-Deklarationen geeignet:
Die Instruktion xsl:processing-instruction ist weder dazu gedacht noch dazu in der Lage, eine (zwar von der Syntax identische) XML-Deklaration zu erzeugen. Bereits der Versuch, die Anweisung den Wert name="xml" zu übergeben, bewirkt eine Fehler­meldung (Anmerkung: Diese Zeichenfolge ist reserviert und daher kein gültiges PITarget.). Die Erzeugung einer XML-Deklaration wird grundsätzlich mittels xsl:output gesteuert.

Achtung – Die XML-Deklaration ist keine Prozessanweisung:
Per Definition zählt die XML-Deklaration nicht zu den Prozessanweisungen, sondern besitzt eine Sonderrolle. Auch sie gilt jedoch nicht als Element und enthält als Inhalt nur Pseudoattribute, die daher für den XML-Parser nicht zugänglich sind.

Beispiele:

Beispiel 1 – Erzeugung einer Stylesheet-PI für ein CSS:

Stylesheet:

...
<xsl:processing-instruction name="xml-stylesheet">href="mein_style.css" type="text/css" title="Defaultstyle"</xsl:processing-instruction>
...
  

Ergebnis:

<?xml-stylesheet href="mein_style.css" type="text/css" title="Defaultstyle"?>

In ein Ergebnisdokument vom Typ »xml« kann auf diese Weise eine Verarbei­tungsanweisung eingefügt werden, die eine Verknüpfung zu einem CSS-Style­­sheet herstellt.

Beispiel 2 – Stylesheet-PI mit select-Attribut erzeugt:

Anstelle des Sequenzkonstruktor kann das select-Attribut eingesetzt werden. In diesem Beispiel wird ihm eine literale Sequenz aus drei Textstrings übergeben, die zum Anweisungsstring der PI zusammengesetzt werden:

Stylesheet:

...
<xsl:processing-instruction name="xml-stylesheet" select="('href=&quot;mein_style.css&quot;', 'type=&quot;text/css&quot;', 'title=&quot;Defaultstyle&quot;)"/>
...

Ergebnis:

<?xml-stylesheet href="mein_style.css" type="text/css" title="Defaultstyle"?>
  

Das Ergebnis gleicht demjenigen aus Beispiel 1.

Beispiel 3 – Erzeugung einer FO-PI für Cocoon:

Stylesheet:

...
<xsl:processing-instruction name="cocoon-format">type="text/xslfo"</xsl:processing-instruction>
...

Ergebnis:

<?cocoon-format type="text/xslfo"?>
  

Die Format-PI weist Cocoon an, ein verarbeitetes Dokument an den integrier­ten FO-Prozessor zur Weiterverarbeitung zu übergeben. Dies geschieht im Anschluss an die Cocoon-interne XSLT-Verarbeitung. In der XSLT-Verarbei­tungsstufe darf die FO-PI jedoch noch nicht im Stylesheet stehen, da sie in die­sem Fall nicht an die folgende Stufe, das FO-Stylesheet, weitergegeben werden könnte. Sie muss also erst zu diesem Zeitpunkt geschrieben werden.

Beispiel 4 – Erzeugung einer PHP-Instruktion in method="html":

Stylesheet:

...
<xsl:output method="html" indent="yes" encoding="UTF-8"/>
<xsl:template match="/">
  ...
  <xsl:processing-instruction name="php">$gruss="Hallo Welt!"; $echo gruss ?</xsl:processing-instruction>
  ...
</xsl:template>
  

Ergebnis:

<?php $gruss="Hallo Welt!"; echo $gruss ?>
  

Sie können mittels xsl:processing-instruction PHP-Anweisungen erzeu­gen, die in ein HTML-Ergebnisdokument eingefügt werden. Hierbei ist zu beachten:

Die Syntax für Prozessanweisungen lautet in HTML nicht

<?pi-name pi-anweisungen ?>

sondern

<?pi-name pi-anweisungen >

was der Syntax für Processing-Instructions in SGML entspricht. Folge: Der XSLT-Prozessor unterschlägt (korrekterweise) das Fragezeichen vor der schlie­ßenden Tagklammer, sobald die Ausgabemethode auf method="html" steht (für method="xhtml" ergibt sich das Problem nicht).

Für eine PHP-Anweisung würde dies allerdings nicht die gewünschte Syntax ergeben. Ein Workaround ist das Einfügen des »fehlenden« Fragezeichens am Ende des PHP-Anweisungsblockes.

Kann man von method="html" auf method="xhtml" ausweichen (was natür­lich nur in XSLT 2.0 möglich ist), so lässt sich diese Schwierigkeit umgehen. Dies ist sicherlich die eleganteste Möglichkeit.

Eine weitere, weniger saubere Alternative wäre anstelle von xsl:processing-instruction die Verwendung von xsl:text mit disable-output-esca­ping="yes"

<xsl:text disable-output-escaping="yes">&lt;?php $gruss="Hallo Welt!"; echo $gruss ?&gt;</xsl:text>
  

Das erzielte Ergebnis ist prinzipiell identisch.

Elementdefinition:

XSLT 1.0

<!-- Category: instruction -->
<xsl:processing-instruction 
     name = { ncname }>

     <!-- Content: template -->
</xsl:processing-instruction>

XSLT 2.0:

<!-- Category: instruction -->
<xsl:processing-instruction
     name = { ncname }>
     select? = expression

     <!-- Content: sequence-constructor -->
</xsl:processing-instruction>

Hinweis: Neu hinzugekommen ist in XSLT 2.0 das optionale Attribut select.

Knotenkonstruktoren für die restlichen Knotentypen existieren in Form von xsl:attribute, xsl:comment, xsl:element, xsl:text und (seit XSLT 2.0) als xsl:namespace.

   

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

Copyright © Galileo Press, Bonn 2008
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XSLT 2.0 & XPath 2.0 ― Das umfassende Handbuch" denselben Bestimmungen wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Galileo Press, Rheinwerkallee 4, 53227 Bonn