Angeben von Auswahlprädikaten im Speicherortpfad (SQLXML 4.0)
Ein Prädikat filtert eine Knotengruppe in Bezug auf eine Achse (ähnlich einer WHERE-Klausel in einer SELECT-Anweisung). Das Prädikat wird zwischen Klammern angegeben. Für jeden Knoten in der zu filternden Knotengruppe wird der Prädikatausdruck mit dem entsprechenden Knoten als Kontextknoten ausgewertet. Die Anzahl der Knoten in der Knotengruppe dient dabei als Kontextgröße. Ergibt die Auswertung des Prädikatausdrucks für den betreffenden Knoten TRUE, wird dieser Knoten in die resultierende Knotengruppe aufgenommen.
XPath ermöglicht auch die positionsbasierte Filterung. Ein Prädikatausdruck, der eine Zahl ergibt, wählt diesen Ordinalzahlenknoten aus. Beispielsweise gibt der Speicherortpfad Customer[3] den dritten Kunden zurück. Solche numerische Prädikate werden nicht unterstützt. Nur Prädikatausdrücke, die ein boolesches Ergebnis zurückgeben, werden unterstützt.
Hinweis |
|---|
Informationen über die Einschränkungen dieser XPath-Implementierung und die Unterschiede zur W3C-Spezifikation finden Sie unter Einführung in die Verwendung von XPath-Abfragen (SQLXML 4.0). |
Auswahlprädikat: Beispiel 1
Der folgende XPath-Ausdruck (Speicherortpfad) wählt alle dem <Customer>-Element untergeordneten Knoten mit dem Wert ALFKI im CustomerID-Attribut aus dem aktuellen Kontextknoten aus:
/child::Customer[attribute::CustomerID="ALFKI"]
In dieser XPath-Abfrage sind child und attribute Achsennamen. Customer ist der Knotentest (TRUE, wenn Customer ein <Elementknoten> ist, da <Element> der primäre Knotentyp für die child Achse ist). attribute::CustomerID="ALFKI" ist das Prädikat. Im Prädikat ist attribute die Achse und CustomerID der Knotentest (TRUE, wenn CustomerID ein Attribut des Kontextknotens ist, weil <Attribut> der primäre Knotentyp für die attribute-Achse ist).
In abgekürzter Syntax kann die XPath-Abfrage auch wie folgt angegeben werden:
/Customer[@CustomerID="ALFKI"]
Auswahlprädikat: Beispiel 2
Der folgende XPath-Ausdruck (Speicherortpfad) wählt alle dem <Order>-Element untergeordneten Knoten zweiter Ordnung mit dem Wert 1 im SalesOrderID-Attribut aus dem aktuellen Kontextknoten aus:
/child::Customer/child::Order[attribute::SalesOrderID="1"]
In diesem XPath-Ausdruck sind child und attribute die Achsennamen. Customer, Order und SalesOrderID sind Knotentests. attribute::OrderID="1" ist das Prädikat.
In abgekürzter Syntax kann die XPath-Abfrage auch wie folgt angegeben werden:
/Customer/Order[@SalesOrderID="1"]
Auswahlprädikat: Beispiel 3
Der folgende XPath-Ausdruck (Speicherortpfad) wählt alle dem <Customer>-Element untergeordneten Konten aus dem aktuellen Kontextknoten aus, die mindestens einen dem <ContactName>-Element untergeordneten Knoten haben:
child::Customer[child::ContactName]
Dieses Beispiel setzt voraus, dass <ContactName> ein untergeordnetes Element des <Customer>-Elements im XML-Dokument ist. Dies wird in einem XSD-Schema mit Anmerkungen als elementzentrierte Zuordnung bezeichnet.
In diesem XPath-Ausdruck ist child der Achsenname. Customer ist der Knotentest (TRUE, wenn Customer ein <Element>-Knoten ist, da <Element> der primäre Knotentyp für die child-Achse ist). child::ContactName ist das Prädikat. Im Prädikat ist child die Achse und ContactName der Knotentest (TRUE, wenn ContactName ein <Element>-Knoten ist).
Dieser Ausdruck gibt ausschließlich die untergeordneten <Customer>-Elemente des Kontextknotens zurück, die untergeordnete <Order>-Elemente enthalten.
In abgekürzter Syntax kann die XPath-Abfrage auch wie folgt angegeben werden:
Customer[ContactName]
Auswahlprädikat: Beispiel 4
Der folgende XPath-Ausdruck wählt die untergeordneten <Customer>-Elemente des Kontextknotens aus, die keine untergeordneten <ContactName>-Elemente enthalten.
child::Customer[not(child::ContactName)]
Dieses Beispiel setzt voraus, dass <ContactName> ein untergeordnetes Element des <Customer>-Elements im XML-Dokument ist und <ContactName> in der Datenbank kein Pflichtfeld ist.
In diesem Beispiel ist child die Achse. Customer ist der Knotentest (TRUE, wenn Customer ein <Element>-Knoten ist). not(child::ContactName) ist das Prädikat. Im Prädikat ist child die Achse und ContactName der Knotentest (TRUE, wenn ContactName ein <Element>-Knoten ist).
In abgekürzter Syntax kann die XPath-Abfrage auch wie folgt angegeben werden:
Customer[not(ContactName)]
Auswahlprädikat: Beispiel 5
Der folgende XPath-Ausdruck wählt alle dem <Customer>-Element untergeordneten Konten mit dem CustomerID-Attribut aus dem aktuellen Kontextknoten aus:
child::Customer[attribute::CustomerID]
In diesem Beispiel ist child die Achse und Customer der Knotentest (TRUE, wenn Customer ein <Element>-Knoten ist). attribute::CustomerID ist das Prädikat. Im Prädikat ist attribute die Achse und CustomerID das Prädikat (TRUE, wenn CustomerID ein <Attribut>-Knoten ist).
In abgekürzter Syntax kann die XPath-Abfrage auch wie folgt angegeben werden:
Customer[@CustomerID]
Auswahlprädikat: Beispiel 6
Microsoft SQLXML 4.0 unterstützt XPath-Abfragen mit einem Kreuzprodukt im Prädikat, wie im folgenden Beispiel gezeigt:
Customer[Order/@OrderDate=Order/@ShipDate]
Durch diese Abfrage werden alle Kunden mit einer Order ausgewählt, bei der OrderDate dem ShipDate für eine beliebige Orderentspricht.
Hinweis