Alles bis auf ein bestimmtes Element auswählen

(Auszug aus "XSLT Kochbuch" von Sal Mangano)

Problem

Sie wollen alle Elemente in einem bestimmten Kontext auswählen, mit Ausnahme derjenigen Elemente, die Sie auslassen wollen.

Lösung

Die beste Möglichkeit, um alle bis auf ein bestimmtes Element auszuwählen, besteht darin, Folgendes anzugeben:

<xsl:apply-templates select="*[not(self::element-to-ignore)]"/>

Falls Sie eine Iteration einbauen wollen, geben Sie Folgendes an:

<xsl:for-each select="*[not(self::element-to-ignore)]">
  ...
</xsl:for-each>

Diskussion

Wenn XSLT-Neulinge alle bis auf ein bestimmtes Element auswählen müssen, nehmen sie wahrscheinlich zunächst ein solches Konstrukt:

<xsl:apply-templates select="*[name( ) != 'element-to-ignore']"/>

Dieser Code funktioniert in vielen Fällen, könnte allerdings Ärger bereiten, wenn das Dokument Namensräume verwendet. Erinnern Sie sich daran, dass name( ) den QName des Knotens zurückliefert: Das Namensraumpräfix verkettet mit dem lokalen Teil des Namens. Allerdings zwingt nichts den Autor, in einem XML-Dokument ein bestimmtes Präfix zu verwenden:

<!--Dies schlägt fehl, falls der Autor beschließt, SALES:product anstelle von sales:product einzusetzen -->
<xsl:apply-templates select="*[name( ) != 'sales:product']"/>

Alternativ könnten Sie local-name( ) benutzen. Allerdings würde dieses Präfix Elemente aus allen Namensräumen ignorieren, die diesen speziellen lokalen Namen tragen. Das ist wahrscheinlich nicht genau das, was Ihnen vorschwebt.

Dieser Vorschlag gilt nur im Fall von Elementen, nicht von Attributen. Falls Sie alle bis auf ein bestimmtes Attribut auswählen müssen, verwenden Sie local-name( ). Die self-Achse bezieht sich nur auf Elemente, wenn sie auf einen Namen angewandt wird. Mit anderen Worten: Benutzen Sie <xsl:copy-of select="@*[local-name( ) != 'ignored-attribute']" /> und nicht <xsl:copy-of select="@*[not(self::ignored-attribute)]" />.

Und schließlich – nur falls Sie jetzt verwirrt sind –, das Auswählen aller Elemente bis auf ein einziges ist anders als das Auswählen aller Instanzen des Elements bis auf eine einzige. Der zweite Fall wird in einem Beispiel verwendet, das weiter vorn in diesem Kapitel besprochen wurde:

<xsl:apply-templates select="*[generate-id( ) != generate-id($node-to-ignore)]"/>

Siehe auch

Jeni Tennisons Buch XSLT and XPath on the Edge (M&T Books, 2001) beschreibt ausführlich, wann name( ) und local-name( ) benutzt werden sollen und wann nicht.

  

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