Aufteilen von Dokumenten

(Auszug aus "XSLT Kochbuch" von Sal Mangano)

Problem

Sie wollen Elemente aus einem einzigen Dokument in Teildokumente untergliedern.

Lösung

XSLT 1.0

Für XSLT 1.0 müssen Sie auf eine weithin verfügbare, aber nicht-standardisierte Erweiterung zurückgreifen, die mehrere Ausgabedokumente erlaubt. (Anmerkung: In XSLT 2.0 ist diese Möglichkeit verfügbar und verwendet ein neues Element namens xsl:result-document, siehe auch Das Potenzial von XSLT 2.0 ausnutzen.) Die Lösung ermittelt die Ebene in der Dokumentstruktur, die serialisiert werden soll, und stellt den Namen der resultierenden Datei fest. Das folgende Stylesheet teilt die Datei salesBySalesPerson.xml aus Auswählen und Durchlaufen so auf, dass für jeden Vertreter eine eigene Datei entsteht. Das Stylesheet funktioniert in Saxon. Saxon erlaubt die Verwendung des XSLT-1.1-Elements xsl:document, wenn die Stylesheet-Version auf 1.1 gesetzt ist; einige Prozessoren unterstützen auch exslt:document von exslt.org. (XSLT 1.1 ist nicht mehr die offizielle Version. Es wurde von XSLT 2.0 abgelöst.)

Falls Sie lieber nicht Version 1.1 verwenden wollen, können Sie die Erweiterung saxon:output benutzen:

<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:include href="copy.xslt"/>
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
  <xsl:strip-space elements="*"/>
  <xsl:template match="salesperson">
    <xsl:variable name="outFile" select="concat('salesperson.',translate(@name,' ','_'),'.xml')"/>
    <!-- Nicht-standardisiertes Saxon xsl:document! -->
    <xsl:document href="{$outFile}">
      <xsl:copy>
        <xsl:copy-of select="@*"/>
        <xsl:apply-templates/>
      </xsl:copy>
    </xsl:document>
  </xsl:template>
  <xsl:template match="salesBySalesperson">
    <xsl:apply-templates/>
  </xsl:template>
</xsl:stylesheet>

Diskussion

Das gezeigte Stylesheet ist zwar Saxon-spezifisch, die Technik funktioniert aber mit nur kleineren Änderungen mit den meisten XSLT 1.0-Prozessoren. Saxon besitzt auch das Erweiterungselement saxon:output (xmlns:saxon=http://icl.com/saxon). Xalan verwendet xalan:redirect (xmlns:xalan=http://xml.apache.org/xalan).

Eine interessante Variante der Aufteilung erzeugt eine Ausgabedatei, die die generierten Unterdateien mit xinclude einbindet:

<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:import href="copy.xslt"/>
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
  <xsl:strip-space elements="*"/>
  <xsl:template match="salesperson">
    <xsl:variable name="outFile" select="concat('salesperson.',translate(@name,' ','_'),'.xml')"/>
    <xsl:document href="{$outFile}">
      <xsl:copy>
        <xsl:copy-of select="@*"/>
        <xsl:apply-templates/>
      </xsl:copy>
    </xsl:document>
    <xi:include href="{$outFile}" xmlns:xi="http://www.w3.org/2001/XInclude"/>
  </xsl:template>
</xsl:stylesheet>

Falls Sie sich Sorgen machen, dass Ihr XSLT-Prozessor eines Tages XInclude bemerkt und fälschlicherweise versucht, dieselbe Datei einzubinden, die gerade ausgegeben wurde, können Sie das xi:include-Element durch xsl:element ersetzen:

<xsl:element name="xi:include" xmlns:xi="http://www.w3.org/2001/XInclude">
  <xsl:attribute name="href">
    <xsl:value-of select="$outFile"/>
  </xsl:attribute>
</xsl:element>

Siehe auch

Das Rezept Saxon-Erweiterungsfunktionen enthält weitere Beispiele, die Erweiterungen für mehrere Ausgabedokumente verwenden.

  

<< 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