Knotentest auf die Knotenart: KindTest

(Auszug aus "XSLT 2.0 & XPath 2.0" von Frank Bongers, Kapitel 4.)

Eine alternative Methode, einen Knoten zu testen, ist anhand seiner Zugehörig­keit zu einer Knotenart gegeben. Dies wird als KindTest bezeichnet. Im Rah­men eines »KindTests« kann neben der Gattungszugehörigkeit eines Knotens ebenfalls die Typbindung, die Position in der Dokumenthierarchie, dessen Inhaltsmodell oder sein Bezeichner überprüft werden, wodurch sich gewisse Überlappungen mit dem Nametest ergeben.

Ein reiner KindTest prüft lediglich die Zugehörigkeit eines Knotens zu einer Knotenart. Für Knoten ohne Bezeichner ist kein anderer Knotentest formulier­bar, und damit auch unmittelbar keine weitere Einschränkung der Zielmenge möglich. Ein solcher Test wählt daher stets alle entsprechenden Knoten auf der betrachteten Achse aus.

Rückblick auf XPath 1.0:
»KindTests« wurden in XPath 2.0 gegenüber XPath 1.0 funktional wesentlich erweitert, indem Tests für Attributknoten, Dokumentknoten und Elementknoten hinzugefügt wurden. Die anderen »KindTests« bleiben im Wesentlichen unverändert.

Allgemeiner Kindtest (alle Knotentypen)

Will man alle Knoten einer Achse auswählen, ohne eine Unterscheidung nach Knotengattung zu treffen, so kann der folgende, allgemeine »KindTest« eingesetzt werden:

  • node()
    trifft auf jeden Knoten auf der betrachteten Achse ungeachtet sei­ner Gattungszugehörigkeit zu. Dieser »KindTest« ist in XPath 2.0 und 1.0 iden­tisch.

Kindtest für Textknoten

Textknoten besitzen keinen Bezeichner oder andere für Knotentests unter­scheidbare Merkmale. Sie können nur pauschal ausgewählt werden:

  • text()
    trifft auf alle Textknoten auf der betrachteten Achse zu. Dieser »KindTest« ist in XPath 2.0 und 1.0 identisch.

Kindtest für Kommentarknoten

Kommentarknoten besitzen ebenfalls keinen Bezeichner und können nur pau­schal ausgewählt werden:

  • comment()
    trifft auf alle Kommentarknoten auf der betrachteten Achse zu. Dieser »KindTest« ist in XPath 2.0 und 1.0 identisch.

Kindtest für Processing-Instruction-Knoten

Processing-Instruction-Knoten können entweder pauschal anhand ihrer Gat­tungszugehörigkeit ausgewählt werden oder anhand ihres Bezeichners, als der der Target-Name (Bezeichner der Zielapplikation) interpretiert wird. Der ent­sprechende »KindTest« kommt daher in zwei Formen vor.

  • Allgemeine Form:
    • processing-instruction()
      passt auf alle PI-Knoten. Die allgemeine Form dieses »KindTests« ist in XPath 2.0 und 1.0 identisch.

  • Einschränkung auf spezielle Targetnamen:
    • processing-instruction(NCName)
      passt auf PI-Knoten, deren Target durch den übergebenen NCNamen (non colonized name) bezeichnet ist. Die direkte Übergabe des NCNamens ohne umgebende Stringbegrenzer ist eine Neuerung in XPath 2.0.

Rückblick auf XPath 1.0:
Aus Gründen der Abwärtskompatibilität zu XPath 1.0 ist weiterhin auch die Form processing-instruction('NCName') gestattet, d.h. die Übergabe des Bezeichners in Stringform (also mit Stringbe­grenzern).

Kindtest für Dokumentknoten

Für den Dokumentknoten als Knotengattung existiert in XPath 2.0 ein eigener Knotentest, der in einer allgemeinen Form oder mit einem durch einen sogenannten Sequenzausdruck beschriebenen Inhaltsmodell vorkommt:

  • Allgemeine Form:
    • document-node()
      trifft auf jeden Dokumentknoten zu.

  • Einschränkung durch Inhaltsmodell:
    • document-node(elementtest)
      Der »KindTest« für den Dokumentkno­ten kann einen Sequenzausdruck in Form eines »KindTests« für Elementkno­ten enthalten, der den Inhalt des Dokumentknotens beschreibt. Konkret bei­spielsweise:

    • document-node(element(buch)) 
      trifft auf einen Dokumentknoten zu, dessen Kindknoten dem Elementtest element(buch) eintspricht – mit anderem Worten ein XML-Dokument, dessen Wurzelelement <buch> heißt.

Neben dem durch den Sequenzausdruck beschriebenen Wurzelelement dür­fen beliebig Kommentar- und Processing-Instruction-Knoten vorkommen, ohne dass dieser Test fehlschlägt.

Rückblick auf XPath 1.0:
In XPath 1.0 existiert kein »KindTest« für Doku­mentknoten.

Kindtest für Elementknoten

Ein »KindTest« für Elementknoten ist in XPath 2.0 ebenfalls formulierbar. Neben seiner allgemeinen Form kann er zusätzlich durch Übergabe eines Bezeichners, des Namens einer Typbindung oder einer Typstrukturangabe spezifiziert wer­den, wobei anstelle einer konkreten Angabe teilweise auch Platzhalter gestattet sind.

  • Allgemeine Form:
    • element()
      trifft auf alle Elementknoten der betrachteten Achse zu. Die Verwendung dieses Knotentests entspricht einem NameTest auf einer Ele­mentachse mit Wildcard-Bezeichner *. Der Schematyp des Elementknotens wird bei diesem Test nicht berücksichtigt.

  • Einschränkung durch Übergabe eines Bezeichners:
    • element(bezeichner)
      Als Bezeichner kann ein QName übergeben werden. In diesem Fall werden nur Elementknoten mit dem entsprechenden QName ausgewählt.

    • element(*)
      Wird anstelle eines konkreten Bezeichners ein Platzhalter übergeben, so ist der »KindTest« synonym zur allgemeinen Form element().

  • Einschränkung durch Übergabe von Bezeichner und Typbindung:
    • element(bezeichner, typangabe)
      Für eine Schematyp-Prüfung kann ein konkreter Typbezeichner übergeben werden, der im statischen Kontext gültig sein muss.

      In dieser Form schlägt der Test für Elementknoten des übergebenen Bezeich­ners und Typs jedoch fehl, wenn der Elementinstanz im Dokument das Null-Attribut xsi:nil="true" beigegeben wurde.

      Die Verwendung dieses Attributs muss in der entsprechenden Schema-Deklaration des Elements durch nillable="true" gestattet sein und wird in einer Instanz des Elements dann eingesetzt, wenn diese – entgegen dem vorgesehenen Inhaltsmodell – leer ist (was ansonsten verboten wäre).

    • element(bezeichner, typangabe ?)
      Soll eine Elementins­tanz auch mit genulltem Inhalt erkannt werden, so kann hinter den Bezeich­ner des Schematyps der Kardinalitätsindikator ? gesetzt werden. Ein Ele­ment wird dann auch mit gesetztem nillable-Attribut erkannt. Die Schema-Deklaration muss das Nullen des Inhalts allerdings erlauben (s. o.).

    • element(*, typangabe)
      Anstelle eines QNames für den Bezeichner kann ein Platzhalter stehen. Der Test trifft dann auf alle Elemente des über­gebenen Schematyps zu, solange sie nicht genullt sind.

    • element(*, typangabe ?)
      Anstelle eines QNames für den Bezeichner kann ein Platzhalter stehen. Der Test trifft dann auf alle Elemente mit dem übergebenen Schematyp zu, auch wenn sie durch xsi:nil="true" genullt sind.

    • element(bezeichner, *)
      Dieser Test verwendet einen Platzhalter für den Schematyp, stellt an diesen also keine weiteren Anforderungen. Er ent­spricht demzufolge dem Elementtest element(bezeichner). Bei dem Bezeich­ner muss es sich um einen QName handeln.

    • element(*,*)
      Handelt es sich, wie hier, in beiden Fällen um Platzhal­ter, so ist dieser Test äquivalent zur allgemeinen Form element().

Rückblick auf XPath 1.0:
In XPath 1.0 existiert kein »KindTest« für Ele­mentknoten. Stattdessen wird stets ein NameTest verwendet. Eine zusätzliche Prüfung eines Elementknotens auf Typbindungen ist in XPath 1.0 nicht mög­lich.

Schematest für Elementknoten (Schema-Element Test)

Ein Elementknoten kann mittels eines Schema-Tests gegen eine Schema-Deklaration getestet werden. Existiert keine passende Schema-Deklaration für den geprüften Knoten, so wird ein statischer Fehler gemeldet (err:XPST0008).

  • schema-element(bezeichner)
    Der Test ist nur dann erfolgreich, wenn eine unter den im Gültigkeitsbereich befindlichen Schemadeklaration eine Toplevel-Deklaration für den übergebenen Elementbezeichner aufzufinden ist, oder dieser im Rahmen einer Ersatzgruppe (substitution group) deklariert ist. Zweitens muss der Typ des getesteten Knotens mit dem Typ der Deklaration übereinstimmen und er darf nicht genullt sein, wenn dies im Rahmen der Deklaration nicht vorgesehen ist.

Kindtest für Attributknoten

Für Attributknoten ist in XPath 2.0 ebenfalls ein »KindTest« vorhanden, der einen Attributknoten nach Bezeichner und/oder Typbindung anhand einer Schema-Deklaration prüfen kann.

  • Allgemeine Form:
    • attribute()
      trifft ungeachtet ihres Bezeichners auf alle Attributkno­ten auf der betrachteten Achse zu.

  • Einschränkung durch Übergabe eines Bezeichners:
    • attribute(@bezeichner)
      Dem »KindTest« kann ein QName übergeben werden, der als Bezeichner auf den zu testenden Attributknoten zutreffen muss. Zu beachten ist, dass vor den QName das @ für die Attributachse gesetzt werden muss.

    • attribute(@*)
      Wird anstelle des QNames ein Wildcard-Platzhalter verwendet (wieder mit vorangestelltem @), so entspricht der »KindTest« dem allgemeinen »KindTest« für Attribute attribute().

  • Einschränkung durch Übergabe von Bezeichner und Typbindung:
    • attribute(@bezeichner, typangabe)
      Für eine Schematyp-Prüfung kann ein konkreter Typbezeichner übergeben werden, der im statischen Kontext gültig sein muss. Es muss sich um einen einfachen Typ (simple type) handeln. Dem QName wird das @ vorangestellt.

    • attribute(@bezeichner, *)
      Dieser Test verwendet einen Platzhalter für den Schematyp, stellt an diesen also keine weiteren Anforderungen. Er entspricht demzufolge dem Attributtest attribute(@bezeichner).

    • attribute(@*, typangabe)
      Der Bezeichner kann durch einen Platz­halter vertreten und gleichzeitig einem Schematyp übergeben werden. Bei diesem muss es sich wiederum um einen einfachen Typ (simple type) han­deln. Ein Attributknoten wird gewählt, wenn sein Typ dem übergebenen Typ entspricht.

    • attribute(@*,*)
      Werden beim »KindTest« sowohl der QName als auch der Typbezeichner durch Platzhalter vertreten, so ist dieser zur allgemeinen Form attribute() äquivalent.

Rückblick auf XPath 1.0:
In XPath 1.0 existiert kein »KindTest« für Attri­butknoten. Stattdessen wird stets ein Nametest auf der Attributachse verwen­det.

Schematest für Attributknoten (Schema-Attribute Test)

Auch Attributknoten können gegenüber einem in-Scope-Schema getestet werden. Hierzu dient der Schema-Attribute-Test. Ist keine entsprechende Deklaration im den zur verfügung stehenden Schemas enthalten, so gilt wird ein statischer Fehler gemeldet (err:XPST0008).

  • schema-attribute(bezeichner)
    In den zur Verfügung stehenden Schemas muss ein Attribut mit dem übergebenen Bezeichner deklariert sein, und der Typ des getesteten Attributknotens dem dort deklarierten Typ entsprechen oder von diesem abgeleitet sein

   

<< zurück vor >>
Tipp der data2type-Redaktion:
Zum Thema XPath 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