Mehrere Dokumente ausgeben

(Auszug aus "XSLT Kochbuch" von Sal Mangano)

Problem

Sie benötigen ein portables Stylesheet, das mehr als ein Dokument ausgeben kann.

Lösung

Die meisten XSLT 1.0-Implementierungen besaßen zwar Erweiterungen, die es ermöglichten, mehrere Dokumente zu verarbeiten, diese unterschieden sich aber voneinander. XSLT 2.0 bietet xsl:result-document.

Die Anweisung xsl:result-document nimmt folgende Attribute entgegen:

format

Definiert den Namen des Ausgabeformats, wie von der benannten Anweisung xsl:output deklariert.

href

Legt das Ziel fest, wo das Ausgabedokument serialisiert werden wird.

validation

Gibt die Validierung an, die auf den Ergebnisbaum angewandt werden soll.

type

Gibt den Typ an, der verwendet werden soll, um den Ergebnisbaum zu validieren.

Hier ist ein Beispiel, das ein XML-Dokument auf der Grundlage der Gruppen, die durch ein xsl:for-each-group extrahiert wurden, in mehrere Dokumente unterteilt. Jedes Ausgabedokument wird benannt, wobei der Gruppierungsschlüssel als Suffix verwendet wird:

<xsl:template match="products">
  <xsl:for-each-group select="product" group-by="@type">
    <xsl:result-document href="prod-{current-grouping-key( )}.xml">
      <xsl:copy-of select="current-group( )"/>
    </xsl:result-document>
  </xsl:for-each-group>
</xsl:template>

Manchmal werden Sie ein Stylesheet haben wollen, das mehr als ein Format ausgibt. Beispielsweise könnte das Standardausgabeformat XML sein, während es sich bei der Ausgabe, die Sie an ein alternatives Ziel schicken, um HTML handeln könnte. Um dies zu erreichen, müssen Sie die XSLT 2.0-Fähigkeit, mehrere Ausgabeformate festzulegen, ausnutzen:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!-- Standardausgabeformat ist XML -->
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
  <!-- Ein weiteres angegebenes Ausgabeformat für HTML -->
  <xsl:output method="html" encoding="UTF-8" indent="yes" name="html-out"/>
  <xsl:template match="/">
    <xsl:apply-templates/>
    <xsl:result-document href="result.html" format="html-out">
      <xsl:apply-templates mode="html"/>
    </xsl:result-document>
  </xsl:template>
  <!-- Hier kommen weitere Templates hin -->
</xsl:stylesheet>

Diskussion

Die Verwendung von xsl:result-document ist zwar eigentlich recht einfach, dennoch besteht die Gefahr der Verwechslung mit einer anderen neuen XSLT 2.0-Anweisung namens xsl:document. Dies liegt daran, dass die XSLT 1.1-Spezifikation (inzwischen außer Kraft) ebenfalls eine Anweisung namens xsl:document enthielt, die ein ähnliches Verhalten wie die 2.0-Anweisung xsl:result-document zeigte.

In 2.0 spielt xsl:document eine eingeschränktere Rolle. Der Zweck dieser Anweisung ist es, einen Dokumentknoten zu konstruieren, weil Sie voraussichtlich eine Validierung auf Dokumentebene vornehmen wollen, ohne das Ergebnis tatsächlich zu serialisieren. Typischerweise werden Sie das Ergebnis von xsl:document in einer Variablen abfangen:

<xsl:variable name="tempDoc" as="document(element(*, my:document))">
  <xsl:document type="my:document" validation="strict">
    <xsl:apply-templates select="/*"/>
  </xsl:document>
</xsl:variable>

Falls Sie im Laufe der weiteren Verarbeitung das Dokument ausgeben wollen, können Sie xsl:result-document benutzen:

<xsl:result-document href="doc.xml">
  <xsl:copy-of select="$tempDoc"/>
</xsl:result-document>

Siehe auch

Siehe das Rezept Aufteilen von Dokumenten für Informationen über XSLT 1.0-Erweiterungen zum Unterstützen mehrerer Ausgabedokumente.

  

<< zurück vor >>

 

 

 

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

Copyright © 2006 O'Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XSLT Kochbuch" 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.

O'Reilly Verlag GmbH & Co. KG, Balthasarstraße 81, 50670 Köln, kommentar(at)oreilly.de