Sdílet prostřednictvím


Výrazy cesty – Určení osy

platí pro:SQL Server

Krok osy ve výrazu cesty obsahuje následující komponenty:

Další informace najdete v tématu výrazy cesty (XQuery).

Implementace XQuery v SQL Serveru podporuje následující kroky osy:

Osa Popis
podřízených Vrátí podřízené položky kontextového uzlu.
potomků Vrátí všechny potomky kontextového uzlu.
nadřazené Vrátí nadřazenou položku kontextového uzlu.
atributu Vrátí atributy kontextového uzlu.
Vrátí samotný kontextový uzel.
potomků Vrátí kontextový uzel a všechny potomky kontextového uzlu.

Všechny tyto osy, s výjimkou nadřazené osy, jsou osou dopředu. nadřazená osa je osa obrácená, protože hledá zpětně v hierarchii dokumentů. Například výraz relativní cesty child::ProductDescription/child::Summary má dva kroky a každý krok určuje child osu. První krok načte <Popis ProductDescription> podřízený prvek kontextového uzlu. Pro každý uzel elementu <ProductDescription> načte druhý krok podřízený uzel elementu><Souhrn.

Relativní výraz cesty, child::root/child::Location/attribute::LocationID, má tři kroky. První dva kroky určují child osu a třetí krok určuje attribute osu. Při provádění proti dokumentům XML výrobních pokynů v tabulce Production.ProductModel vrátí výraz atribut LocationID podřízeného prvku prvku <Location> elementu podřízeného prvku <kořenového> prvku.

Příklady

Příklady dotazů v tomto tématu jsou zadané pro sloupce typu xml v databázi AdventureWorks.

A. Určení podřízené osy

Pro konkrétní produktový model načte následující dotaz podřízené prvky prvku <Funkce> uzel prvku <ProductDescription> uzlu prvku z popisu katalogu produktů uloženého v tabulce Production.ProductModel.

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  

Všimněte si následujících věcí z předchozího dotazu:

  • Metoda query() datového typu xml určuje výraz cesty.

  • Oba kroky ve výrazu cesty určují child osu a názvy uzlů, ProductDescription a Featuresjako testy uzlů. Informace o testech uzlů najdete v tématu Určení testu uzlu v kroku výrazu cesty.

B. Určení os potomků a potomků nebo samoobsadí

Následující příklad používá osy potomků a potomků nebo sebe sama. Dotaz v tomto příkladu je určen pro xml proměnnou typu. Instance XML je zjednodušená, aby bylo možné snadno znázornit rozdíl ve generovaných výsledcích.

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  

V následujícím výsledku výraz vrátí podřízený uzel prvku <b> uzlu <a> elementu:

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

Pokud v tomto výrazu zadáte potomkovou osu výrazu cesty,

/child::a/child::b/descendant::*, žádáte o všechny potomky uzlu elementu <b>.

Hvězdička (*) v testu uzlu představuje název uzlu jako test uzlu. Proto primární typ uzlu potomku osy, uzel elementu, určuje typy vrácených uzlů. To znamená, že výraz vrátí všechny uzly elementu.. Textové uzly se nevrátí. Další informace o primárním typu uzlu a jeho vztahu s testem uzlu najdete v tématu Určení testu uzlu v kroku výrazu cesty tématu.

Vrátí se uzly prvků <c> a <d>, jak je znázorněno v následujícím výsledku:

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

Pokud místo osy potomků zadáte osu potomků nebo sebe sama, /child::a/child::b/descendant-or-self::* vrátí kontextový uzel, prvek <b>a jeho potomek.

Toto je výsledek:

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

Následující ukázkový dotaz na databázi AdventureWorks načte všechny uzly následnických elementů podřízeného prvku <Features> elementu <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. Určení nadřazené osy

Následující dotaz vrátí podřízený prvek <Summary> elementu <ProductDescription> v dokumentu XML katalogu produktů uložených v tabulce Production.ProductModel.

Tento příklad používá nadřazenou osu k návratu do nadřazeného prvku <Feature> a načtení podřízeného prvku <Summary> elementu <ProductDescription> elementu.

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  
  

V tomto příkladu dotazu výraz cesty používá osu parent. Výraz můžete přepsat bez nadřazené osy, jak je znázorněno v následujícím příkladu:

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

Užitečnější příklad nadřazené osy je uveden v následujícím příkladu.

Každý popis katalogu modelů produktů uložený ve sloupci CatalogDescription v tabulce ProductModel má prvek <ProductDescription>, který má atribut ProductModelID a podřízený prvek <Features>, jak je znázorněno v následujícím fragmentu:

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

Dotaz nastaví proměnnou iterátoru, $f, v příkazu FLWOR vrátit podřízený prvek <Features> elementu. Další informace najdete v příkazu FLWOR a iterace (XQuery). Pro každou funkci return klauzule vytvoří XML v následujícím formátu:

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

Pokud chcete přidat ProductModelID pro každý prvek <Feature>, je zadaná osa parent:

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  

Toto je částečný výsledek:

<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>  

Všimněte si, že predikát [1] ve výrazu cesty je přidán k zajištění, že je vrácena hodnota singleton.