xsl:copy-of

(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:copy-of kopiert Teilzweige (deep copy) des Quelldokuments, ausgehend von einem durch ihr select-Attribut bezeichneten Knoten.

Klassifizierung Instruktion
Funktionsgruppe Kopieren aus dem Quelldokument
Einführung XSLT 1.0

Position im Stylesheet und erlaubte Inhalte:

xsl:copy-of tritt als Instruktion nur innerhalb von Templatekörpern auf. Die Instruktion ist stets leer.

Attribute:

Für xsl:copy-of gelten die Standardattribute. Darüberhinaus besitzt die Instruktion in XSLT 1.0 und XSLT 2.0 ein obligatorisches Attribut select. In XSLT 2.0 stehen zusätzlich die Attribute copy-namespaces und type oder validation zur Verfügung.

copy-namespaces

Wert

"yes" (Default) | "no"

Verwendung

Optional

Einführung

XSLT 2.0

Das Attribut copy-namespaces kann die Werte yes oder no annehmen. Der Defaultwert ist yes. Bestimmt wird, ob die Namensräume innerhalb des kopierten Teilzweiges mitkopiert werden sollen.

Hinweis: Das Attribut existiert nicht in XSLT 1.0.

select

Wert

xpath-expression

Verwendung

Obligatorisch

Einführung

XSLT 1.0

Das select-Attribut bestimmt durch einen XPath-Ausdruck eine Sequenz der Ursprungsknoten von in die Resultatsequenz zu kopierenden Teilzweigen (in der Regel des Quelldokuments). Die erzeugte Sequenz darf auch atomare Werte als Items enthalten.

type

Wert

QName

Verwendung

Optional (nicht gleichzeitig mit validation-Attribut)

Einführung

XSLT 2.0

Das type-Attribut nennt den QName eines Schema-Datentyps, der mit den kopierten Element- und Attributknoten verknüpft werden soll. Es kann sich um einen vordefinierten (built-in) Typ oder um einen Typ aus einem importierten Schema handeln. Es ist ein statischer Fehler, wenn keine Deklaration dieses Namens auffindbar ist (ERR XTSE1520). Ist die Validierung erfolgreich, d.h., hat das validity-Property des entsprechend erzeugten PSVI den Wert valid, so wird der Datentyp mit dem Knoten verknüpft, andernfalls wird die Verarbeitung des Stylesheets abgebrochen (ERR XTTE1540). Hierbei sind nur die unmittelbar durch das select-Attribut gewählten Knoten betroffen, nicht jedoch (bei Elementen) mitkopierte Kindknoten.

Hinweis: Das type-Attribut darf nicht gleichzeitig mit dem validation-Attribut verwendet werden. Das Attribut existiert nicht in XSLT 1.0.

validation

Wert

"strict" | "lax" | "preserve" | "strip"

Verwendung

Optional (nicht gleichzeitig mit type-Attribut)

Einführung

XSLT 2.0

Das validation-Attribut bestimmt die Validierungs­stufe. Der Default­wert bei Abwesenheit des Attributs ist strip, sofern nicht im xsl:styles­heet-Element ein default-validation-Attribut mit anderem Wert gesetzt ist. Handelt es sich bei dem zu kopierenden Item nicht um einen Element- oder Attributknoten, so wird das validation-Attribut ignoriert.

Hinweis: Das validation-Attribut darf nicht gleichzeitig mit dem type-Attribut verwendet werden. Das Attribut existiert nicht in XSLT 1.0.

Die vier möglichen expliziten Werte sind strict, lax, preserve und strip – sie haben für xsl:copy-of im Einzelnen folgende Wirkungen:

  • validation="strict"
    Der Wert strict erzwingt eine strikte Validierung des kopierten Knotens und seines Inhalts gemäß eines Schemas. Der Knoten muss also in einem Schema deklariert sein, das an dieser Stelle mit Hilfe der in XML Schema üblichen Methoden zur Verfügung stehen muss. Das so für den Knoten ermittelte validity-Property im Rahmen des entsprechenden PSVI muss den Wert valid besitzen. Hat das Property den Wert invalid oder notKnown, so scheitert die Transformation an dieser Stelle mit einem Typfehler (ERR XTTE1510 bzw. ERR XTTE1512).
  • validation="lax"
    Der Wert lax erfordert ebenfalls eine Validierung des kopierten Knotens gemäß eines zur Verfügung stehenden Schemas – aller­dings gilt es nicht als Fehler, wenn kein solches Schema zur Verfügung steht oder der Knoten im Rahmen eines vorhandenen Schemas nicht deklariert ist. Das für den Knoten ermittelte validity-Property darf also neben valid auch den Wert notKnown besitzen. In letzterem Fall wird dem (nicht vali­dierten) Knoten der Typ xs:untyped zugewiesen, falls es sich um einen Ele­mentknoten handelt. Der Typ eines kopierten Attributknotens bleibt im Gegensatz dazu unverändert. Hat das validity-Property dagegen den Wert invalid, so scheitert die Transformation an dieser Stelle wiederum mit einem Typfehler (ERR XTTE1515).
  • validation="preserve"
    Der Wert preserve erhält für einen kopierten Attribut- oder Elementknoten dessen Bindung an einen bestimmten Daten­typ. (Anmerkung: Hier unterscheidet sich xsl:copy-of von xsl:copy, wo dies nur für Attribut-, nicht aber für Elementknoten der Fall ist.) Der Wert preserve ist für das validation-Attribut jedoch nur dann zulässig, wenn das Mitkopieren von Namensraumknoten nicht unterbunden wurde.
  • validation="strip"
    Der Wert strip löst jegliche eventuell vorhan­dene Datentypbindung und weist einem kopierten Attributknoten den Typ xs:untypedAtomic, einem kopierten Elementknoten den Typ xs:unty­ped zu. Für letztere wird deren nilled-Property generell auf den Wert false gesetzt. Ein kopierter Attributknoten, bei dem es sich um einen Identifier ID oder ein IDREFS-Attribut handelt, behält seine is-id- bzw. seine is-idrefs-Eigenschaft.

Verwendungszweck:

Man setzt die Anweisung xsl:copy-of ein, um einen durch das select-Attribut bezeichneten Knoten (in der Regel aus dem Quell­dokument) mitsamt Attribut- und Namensraumknoten sowie aller seiner Abkömmlinge (descendants) unverändert ins Ergebnisdokument zu kopieren. Enthalten sind daher alle Element-, Attribut-, Kommentar-, PI- und Textknoten des Zweigs mit zugehörigen Namensräumen. Dies entspricht einer »tiefen« Kopie (deep copy).

Das Kopieren der Namensräume kann seit XSLT 2.0 durch ein entsprechend gesetztes Attribut copy-namespaces="no" verhindert werden. Außerdem ist als Ergebnis des select-Ausdrucks nunmehr eine Sequenz möglich, die auch Nicht-Knoten enthalten kann bzw. ausschließlich aus solchen bestehen kann.

Wird die Instruktion auf einen Elementknoten angewendet, so wird in der Resultatsequenz eine Kopie dieses Elementknotens mit gleichem QName erzeugt. Attribute und Elementinhalt werden in Form einer deep copy mitko­piert.

Auf einen Dokumentknoten angewendet, wird dieser mitsamt seiner Kind­knoten der Resultatsequenz der Transformation hinzugefügt (im Zuge der Seri­alisierung wird dieser Dokumentknoten durch seine(n) Kindknoten ersetzt, das kopierte Dokument also gegebenenfalls ab einschließlich seines Wurzelele­ments als Zweig in das Ergebnisdokument eingesetzt).

Angewendet auf andere Knotentypen und auf atomare Werte, verhält sich xsl:copy-of genau wie xsl:copy.

Beispiele:

Beispiel 1 – Tiefe Kopie eines Zweiges:

<xsl:template match="zweig">
  <xsl:copy-of select="."/>
</xsl:template>

Dieses Template kopiert das Element <zweig> und alle seine Descendants unverändert ins Ergebnisdokument.

Beispiel 2 – Kopieren aus dem gesamten Quelldokument:

<xsl:template match="buchliste">
  <titelliste>
    <xsl:copy-of select="//titel"/>
  </titelliste>
  <!-- weitere Instruktionen -->
</xsl:template>

Dieses Template kopiert beim Verarbeiten einer Buchliste zunächst eine Liste aller <titel>-Elemente des Dokuments.

Beispiel 3 – Wiederholen von Output-Bausteinen:

Die zu kopierenden Teilzweige müssen nicht notwendigerweise im Quelldoku­ment liegen, sondern können auch, analog zu Textbausteinen, im Stylesheetdo­kument selbst definiert werden.

Quelldokument:

<buecher>
  <buch titel="Einstieg in XML"/>
  <buch titel="Einstieg in XSLT"/>
</buecher>

Stylesheetdokument:

<!-- Teilzweig als Variable -->
<xsl:variable name="verlagsdaten">
  <verlag>
    <name>Galileo Verlag</name>
    <ort>Bonn</ort>
  </verlag>
</xsl:variable>
<xsl:template match="/">
  <verlagsprogramm>
    <xsl:apply-templates/>
  </verlagsprogramm>
</xsl:template>
<xsl:template match="buch">
  <buch>
    <titel><xsl:value-of select="@titel"/></titel>
    <xsl:copy-of select="$verlagsdaten"/>
  </buch>
</xsl:template>

Serialisiertes Ergebnisdokument:

<verlagsprogramm>
  <buch>
    <titel>Einstieg in XML</titel>
    <verlag>
      <name>Galileo Verlag</name>
      <ort>Bonn</ort>
    </verlag>
  </buch>
  <buch>
    <titel>Einstieg in XSLT</titel>
    <verlag>
      <name>Galileo Verlag</name>
      <ort>Bonn</ort>
    </verlag>
  </buch>
</verlagsprogramm>

Ein mehrfach zu wiederholender Quelltextabschnitt kann in eine Variable gespeichert werden und bei Bedarf mittels xsl:copy-of vollständig in das Ergebnisdokument kopiert werden.

Elementdefinition:

XSLT 1.0:

<!-- Category: instruction -->
<xsl:copy-of 
     select = expression 
/>

XSLT 2.0:

<!-- Category: instruction -->
<xsl:copy-of
     select = expression
     copy-namespaces? = "yes" | "no"
     validation? = "strict" | "lax" | "preserve" | "strip"
     type? = qname 
/>
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