Angeben einer Achse in einem Pfadausdrucksschritt

Ein Achsenschritt in einem Pfadausdruck besteht aus den folgenden Komponenten:

Weitere Informationen finden Sie unter Pfadausdrücke (XQuery).

Die XQuery-Implementierung in SQL Server 2005 unterstützt folgende Achsenschritte:

Achse Beschreibung

child

Gibt die untergeordneten Elemente des Kontextknotens zurück.

descendant

Gibt alle nachfolgenden Elemente des Kontextknotens zurück.

parent

Gibt das übergeordnete Element des Kontextknotens zurück.

attribute

Gibt die Attribute des Kontextknotens zurück.

self

Gibt den Kontextknoten selbst zurück.

descendant-or-self

Gibt den Kontextknoten und alle nachfolgenden Elemente des Kontextknotens zurück.

Alle diese Achsen sind vorwärtsgerichtete Achsen, mit Ausnahme der parent-Achse. Die parent-Achse ist eine rückwärtsgerichtete Achse, da sie in der Dokumenthierarchie nach hinten sucht. Beispiel: Der relative Pfadausdruck child::ProductDescription/child::Summary enthält zwei Schritte, von denen jeder eine child-Achse angibt. Der erste Schritt ruft die untergeordneten <ProductDescription>-Elemente des Kontextknotens ab. Der zweite Schritt ruft für jeden <ProductDescription>-Elementknoten die untergeordneten <Summary>-Elementknoten ab.

Der relative Pfadausdruck child::root/child::Location/attribute::LocationID besitzt drei Schritte. Die ersten beiden Schritte geben jeweils eine child-Achse und der dritte die attribute-Achse an. Wenn dieser Ausdruck für die XML-Dokumente mit den Fertigungsanweisungen in der Production.ProductModel-Tabelle ausgeführt wird, gibt er das LocationID-Attribut des untergeordneten <Location>-Elementknotens des <root>-Elements zurück.

Beispiele:

Die Abfragebeispiele in diesem Thema werden für die verschiedenen Spalten des xml-Typs in der AdventureWorks-Datenbank angegeben. Informationen zu diesen Spalten finden Sie unter Darstellung des xml-Datentyps in der AdventureWorks-Datenbank.

A. Angeben einer child-Achse

Die folgende Abfrage ruft für ein bestimmtes Produktmodell die untergeordneten <Features>-Elementknoten des <ProductDescription>-Elementknotens aus der in der Production.ProductModel-Tabelle gespeicherten Produktkatalogbeschreibung ab.

SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
  /child::PD:ProductDescription/child::PD:Features')
FROM Production.ProductModel
WHERE ProductModelID=19

Beachten Sie hinsichtlich der vorherigen Abfrage Folgendes:

  • Die query()-Methode von Datentyp xml gibt den Pfadausdruck an.
  • Beide Schritte des Pfadausdrucks geben eine child-Achse und die Knotennamen ProductDescription und Features als Knotentests an. Weitere Informationen zu Knotentests finden Sie unter Angeben eines Knotentests in einem Pfadausdrucksschritt.

B. Angeben von descendant- und descendant-or-self-Achsen

In diesem Beispiel werden descendant- und descendant-or-self-Achsen verwendet. Die Abfrage in diesem Beispiel wird für eine Variable vom Typ xml angegeben. Die XML-Instanz wird hier zur Veranschaulichung der Unterschiede in den generierten Ergebnissen vereinfacht dargestellt.

declare @x xml
set @x='
<a>
 <b>text1
   <c>text2
     <d>text3</d>
   </c>
 </b>
</a>'
declare @y xml
set @y = @x.query('
  /child::a/child::b
')
select @y

Im folgenden Ergebnis gibt der Ausdruck einen untergeordneten Elementknoten <b> eines Elementknotens <a> zurück.

<b>text1
   <c>text2
     <d>text3</d>
   </c>
</b>

Wenn Sie in diesem Ausdruck eine descendant-Achse für den Pfadausdruck angeben,

/child::a/child::b/descendant::*, rufen Sie damit alle nachfolgenden Elemente des <b>-Elementknotens ab.

Das Sternchen (*) im Knotentest stellt den Knotennamen als Knotentest dar. Folglich bestimmt der Typ des Primärknotens der descendant-Achse (der Elementknoten) den Typ der zurückgegebenen Knoten, d. h. in diesem Fall, dass der Ausdruck alle Elementknoten zurückgibt. Es werden keine Textknoten zurückgegeben. Weitere Informationen zum Typ des primären Knotens und dessen Beziehung zum Knotentest finden Sie unter Angeben eines Knotentests in einem Pfadausdrucksschritt.

Wie im folgenden Ergebnis gezeigt, werden die Elementknoten <c> und <d> zurückgegeben:

<c>text2
     <d>text3</d>
</c>
<d>text3</d>

Wenn Sie eine descendant-or-self-Achse statt einer descendant-Achse angeben, gibt /child::a/child::b/descendant-or-self::* den Kontextknoten, das Element <b>, und seine Nachfolger zurück:

Dies ist das Ergebnis:

<b>text1
   <c>text2
     <d>text3</d>
   </c>
</b>

<c>text2
     <d>text3</d>
</c>

<d>text3</d> 

Die folgende Beispielabfrage für die AdventureWorks-Datenbank ruft alle nachfolgenden Elementknoten des untergeordneten <Features>-Elements des <ProductDescription>-Elements ab:

SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
  /child::PD:ProductDescription/child::PD:Features/descendant::*
')
FROM  Production.ProductModel
WHERE ProductModelID=19

C. Angeben einer parent-Achse

Die folgende Abfrage gibt das untergeordnete <Summary>-Element des <ProductDescription>-Elements aus dem Produktkatalog-XML-Dokument zurück, das in der Production.ProductModel-Tabelle gespeichert ist:

In diesem Beispiel wird die parent-Achse verwendet, um zu dem übergeordneten Element von <Feature> zurückzukehren und das untergeordnete <Summary>-Element des <ProductDescription>-Elements abzurufen.

SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
  
/child::PD:ProductDescription/child::PD:Features/parent::PD:ProductDescription/child::PD:Summary
')
FROM   Production.ProductModel
WHERE  ProductModelID=19 
 

In dieser Beispielabfrage verwendet der Pfadausdruck die parent-Achse. Sie können den Ausdruck auch ohne die parent-Achse schreiben, wie im Folgenden gezeigt:

  /child::PD:ProductDescription[child::PD:Features]/child::PD:Summary

Ein nützlicheres Beispiel für die parent-Achse wird im folgenden Beispiel bereitgestellt.

Jede in der CatalogDescription-Spalte der ProductModel-Tabelle gespeicherte Produktmodell-Katalogbeschreibung besitzt ein <ProductDescription>-Element mit einem ProductModelID-Attribut und einem untergeordneten <Features>-Element, wie im folgenden Codefragment gezeigt:

<ProductDescription ProductModelID="..." >
  ...
  <Features>
    <Feature1>...</Feature1>
    <Feature2>...</Feature2>
   ...
</ProductDescription>

Die Abfrage legt in der FLWOR-Anweisung eine Iteratorvariable, $f, fest, damit die untergeordneten Elemente des <Features>-Element zurückgegeben werden. Weitere Informationen finden Sie unter FLWOR-Anweisung und -Iteration (XQuery). Für jedes Feature-Element konstruiert die return-Klausel ein XML-Dokument in der folgenden Form:

<Feature ProductModelID="...">...</Feature>
<Feature ProductModelID="...">...</Feature>

Um die ProductModelID für jedes <Feature>-Element hinzuzufügen, wird die parent-Achse angegeben:

SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
declare namespace wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";
  for $f in /child::PD:ProductDescription/child::PD:Features/child::*
  return
   <Feature
     ProductModelID="{ ($f/parent::PD:Features/parent::PD:ProductDescription/attribute::ProductModelID)[1]}" >
          { $f }
   </Feature>
')
FROM  Production.ProductModel
WHERE ProductModelID=19

Dies ist das Teilergebnis:

<Feature ProductModelID="19">
  <wm:Warranty 
   xmlns:wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">
    <wm:WarrantyPeriod>3 years</wm:WarrantyPeriod>
    <wm:Description>parts and labor</wm:Description>
  </wm:Warranty>
</Feature>
<Feature ProductModelID="19">
  <wm:Maintenance 
   xmlns:wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">
    <wm:NoOfYears>10 years</wm:NoOfYears>
    <wm:Description>maintenance contract available through your dealer 
                  or any AdventureWorks retail store.</wm:Description>
  </wm:Maintenance>
</Feature>
<Feature ProductModelID="19">
  <p1:wheel 
   xmlns:p1="https://www.adventure-works.com/schemas/OtherFeatures">
      High performance wheels.
  </p1:wheel>
</Feature>

Beachten Sie, dass dem Pfadausdruck das Prädikat [1] hinzugefügt wird, um sicherzustellen, dass ein Singleton-Wert zurückgegeben wird.