Abfragen ausführen, bei denen die Struktur erhalten bleibt

(Auszug aus "XSLT Kochbuch" von Sal Mangano)

Problem

Sie müssen ein XML-Dokument so abfragen, dass die Antwort eine Struktur besitzt, die identisch mit dem Original ist.

Lösung

Strukturerhaltende Abfragen filtern irrelevante Informationen heraus, während der größte Teil der Dokumentstruktur erhalten bleibt. Der Grad, in dem die Ausgabestruktur der Struktur der Eingabe ähnelt, ist der Maßstab, der die Anwendbarkeit dieses Beispiels bestimmt. Je ähnlicher sie ist, umso stärker gilt dieses Beispiel.

Das Beispiel weist zwei Komponenten auf – eine wiederverwendbare und eine eigene. Die wiederverwendbare Komponente ist ein Stylesheet, das alle Knoten in die Ausgabe kopiert (Identity-Transformation). Wir benutzten dieses Stylesheet, das im folgenden Beispiel zu sehen ist, ausführlich unter Das Potenzial von XSLT 2.0 ausnutzen.

Beispiel: copy.xslt

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="node() | @*">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

Die eigene Komponente ist ein Stylesheet, das copy.xslt importiert und Regeln aufstellt, um dessen vorgegebenes Verhalten außer Kraft zu setzen. Beispielsweise liefert das folgende Stylesheet eine Ausgabe, die identisch mit people.xml ist, allerdings nur weibliche Raucher zeigt:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:import href="copy.xslt"/>
  <!-- Leerräume zusammenfassen, die durch das Entfernen von person-Elementen entstehen -->
  <xsl:strip-space elements="people"/>
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
  <xsl:template match="person[@sex = 'w' and @smoker='ja']">
    <!-- Anwenden des vorgegebenen Verhaltens, d.h. des Kopierens -->
    <xsl:apply-imports/>
  </xsl:template>
  <!-- Andere Leute ignorieren -->
  <xsl:template match="person"/>
</xsl:stylesheet>

Alternativ kann ein einzelnes Template die Dinge erfassen, die Sie ausschließen wollen, und dann nichts mit ihnen tun:

<xsl:template match="person[@sex != 'w' or @smoker != 'ja']" />

Diskussion

Dieses Beispiel ist außerordentlich nützlich, weil es Ihnen erlaubt, die Struktur eines XML-Dokuments zu bewahren, ohne dass Sie unbedingt wissen müssen, wie diese Struktur aussieht. Sie müssen nur wissen, welche Elemente herausgefiltert werden sollen. Für diesen Zweck legen Sie Templates an.

Dieses Beispiel kann in Kontexten angewandt werden, die die meisten Leute nicht als Abfragen beschreiben würden. Nehmen Sie zum Beispiel an, dass Sie ein XML-Dokument klonen wollen. Dabei wollen Sie aber alle Attribute namens sex entfernen und sie durch ein Attribut namens gender ersetzen:

<xsl:stylesheet version="1.0" 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:template match="@sex">
    <xsl:attribute name="gender">
      <xsl:value-of select="."/>
    </xsl:attribute>
  </xsl:template>
</xsl:stylesheet>

Das Schöne an diesem Beispiel ist, dass es auf jedem XML-Dokument funktioniert, ungeachtet seines Schemas. Wenn das Dokument Elemente mit einem Attribut namens sex besitzt, wird dieses zu gender:

Können Sie erraten, was die folgende Variante tut? (Es gibt sowohl das Attribut gender als auch das Attribut sex aus, aber das wussten Sie ja schon!)

<xsl:stylesheet version="1.0" 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:template match="@sex">
    <xsl:attribute name="gender">
      <xsl:value-of select="."/>
    </xsl:attribute>
    <xsl:apply-imports/>
  </xsl:template>
</xsl:stylesheet>

  

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