Výrazy cesty – Určení osy
platí pro:SQL Server
Krok osy ve výrazu cesty obsahuje následující komponenty:
Osa
Testovací uzlu
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
aFeatures
jako 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.