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 Path Expressions (XQuery).For more information, see Path Expressions (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> ruft der zweite Schritt die untergeordneten Elemente des <Summary-Elementknotens> 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. Bei Ausführung anhand der XML-Dokumente für die Herstellungsanweisungen in der Tabelle "Production.ProductModel " gibt der Ausdruck das LocationID Attribut des <untergeordneten Knotens "Location> " des <Stammelements> zurück.

Beispiele

Die Abfragebeispiele in diesem Thema werden anhand von XML-Typspalten in der AdventureWorks-Datenbank angegeben.

A. Angeben einer child-Achse

Bei einem bestimmten Produktmodell ruft die folgende Abfrage die <untergeordneten Elemente> 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 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::*, sie fragen 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 dessen Beziehung zum Knotentest finden Sie unter Angeben des Knotentests in einem Thema "Pfadausdrucksschritt ".

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

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

Wenn Sie anstelle der untergeordneten Achse eine untergeordnete Oder-Selbst-Achse angeben, /child::a/child::b/descendant-or-self::* werden der Kontextknoten, das Element <b>und dessen absteigende Achse 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 untergeordneten Elementknoten des <Features> untergeordneten 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 ü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 Beschreibung des Produktmodellkatalogs, die in der Spalte "CatalogDescription" der Tabelle "ProductModel" gespeichert ist, weist ein <ProductDescription> Element auf, das das Attribut und <Features> das ProductModelID untergeordnete Element aufweist, wie im folgenden Fragment dargestellt:

<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).For more information, see FLWOR Statement and 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 die ProductModelID einzelnen <Feature> Elemente 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.