Freigeben über


Pfadausdrücke – Angeben der Achse

Gilt für:SQL Server

Ein Achsenschritt in einem Pfadausdruck besteht aus den folgenden Komponenten:

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

Die XQuery-Implementierung in SQL Server unterstützt die folgenden 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.
Selbst Gibt den Kontextknoten selbst zurück.
descendant-or-self Gibt den Kontextknoten und alle nachfolgenden Elemente des Kontextknotens zurück.

Alle diese Achsen mit Ausnahme der übergeordneten Achse sind Vorwärtsachsen. Die übergeordnete Achse ist eine umgekehrte Achse, da sie in der Dokumenthierarchie rückwärts sucht. Beispiel: Der relative Pfadausdruck child::ProductDescription/child::Summary enthält zwei Schritte, von denen jeder eine child-Achse angibt. Im ersten Schritt werden die <untergeordneten Elemente des ProductDescription-Elements> des Kontextknotens abgerufen. Für jeden <ProductDescription-Elementknoten> wird im zweiten Schritt der untergeordnete Knoten des <Summary-Elements> abgerufen.

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 der Ausdruck für die XML-Dokumente der Produktionsanweisungen in der Tabelle Production.ProductModel ausgeführt wird, gibt der Ausdruck das LocationID Attribut des <untergeordneten Knotens> location des <Stammelements> zurück.

Beispiele

Die Abfragebeispiele in diesem Thema werden für Xml-Typspalten in der AdventureWorks-Datenbank angegeben.

A. Angeben einer child-Achse

Für ein bestimmtes Produktmodell ruft die folgende Abfrage die untergeordneten Elemente des <Elementknotens Features> des <ProductDescription-Elementknotens> aus der produktkatalogbeschreibung ab, die in der Production.ProductModel Tabelle gespeichert ist.

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 des xml-Datentyps gibt den Pfadausdruck an.

  • Beide Schritte des Pfadausdrucks geben eine child-Achse und die Knotennamen ProductDescription und Features als Knotentests an. Informationen zu Knotentests finden Sie unter Angeben des 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 Xml-Typvariable 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::*, fragen Sie nach allen Nachfolgern des <b> Elementknotens.

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 primären Knotentyp und seiner Beziehung zum Knotentest finden Sie im Thema Angeben des Knotentests in einem Pfadausdrucksschritt .

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

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

Wenn Sie anstelle der Nachkommaachse eine Nachfolger- oder Selbstachse angeben, /child::a/child::b/descendant-or-self::* werden der Kontextknoten, das Element <b>und dessen Nachfolger zurückgegeben.

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 Nachfolgerelementknoten des <Features> untergeordneten Elements des Elements ab:<ProductDescription>

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 übergeordneten Achse

Die folgende Abfrage gibt das <Summary> untergeordnete Element des><ProductDescriptionElements im XML-Dokument des Produktkatalogs zurück, das in der Production.ProductModel Tabelle gespeichert ist.

In diesem Beispiel wird die übergeordnete Achse verwendet, um zum übergeordneten Element des <Feature> Elements zurückzukehren und das <Summary> untergeordnete 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 Produktmodellkatalogbeschreibung, die in der CatalogDescription-Spalte der ProductModel-Tabelle gespeichert ist, verfügt über ein <ProductDescription> Element, das das Attribut und <Features> das ProductModelID untergeordnete Element enthält, wie im folgenden Fragment 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 Funktions-Element konstruiert die return-Klausel ein XML-Dokument in der folgenden Form:

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

Um für ProductModelID 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.