Výrazy cesty – Určení testu uzlu
platí pro:SQL Server
Krok v ose ve výrazu cesty obsahuje následující komponenty:
Další informace najdete v tématu výrazy cesty (XQuery).
Test uzlu je podmínkou a je druhou součástí kroku osy ve výrazu cesty. Všechny uzly vybrané krokem musí splňovat tuto podmínku. Pro výraz cesty /child::ProductDescription
je uzlový test ProductDescription
. Tento krok načte pouze ty uzly elementů, jejichž název je ProductDescription.
Testovací podmínka uzlu může zahrnovat následující:
Název uzlu. Vrátí se pouze uzly typu hlavního uzlu se zadaným názvem.
Typ uzlu. Vrátí se pouze uzly zadaného typu.
Poznámka
Názvy uzlů zadané ve výrazech cest XQuery nepodléhají stejným pravidlům citlivým na kolaci jako dotazy Transact-SQL a vždy rozlišují malá a velká písmena.
Název uzlu jako "Node Test"
Při zadávání názvu uzlu jako testu uzlu ve fázi výrazu cesty musíte porozumět principu druhu hlavního uzlu. Každá osa, podřízený prvek, nadřazený prvek nebo atribut má hlavní druh uzlu. Například:
Osa atributů může obsahovat pouze atributy. Uzel atributu je tedy druh hlavního uzlu osy atributu.
Pokud uzly vybrané osou mohou obsahovat uzly prvků, je prvek hlavním druhem uzlu pro tuto osu.
Když jako test uzlu zadáte název uzlu, vrátí krok následující typy uzlů:
Uzly, které jsou typu hlavního uzlu osy.
Uzly, které mají stejný název jako zadaný v testu uzlu.
Představte si například následující výraz cesty:
child::ProductDescription
Tento jednokrokový výraz určuje child
osu a název uzlu ProductDescription
jako test uzlu. Výraz vrátí pouze ty uzly, které jsou hlavního druhu uzlu na podřízené ose, to znamená uzly prvků, a které mají ProductDescription jako jejich název.
Výraz cesty /child::PD:ProductDescription/child::PD:Features/descendant::*,
má tři kroky. Tyto kroky určují podřízené a potomkové osy. V každém kroku je název uzlu určen jako test uzlu. Zástupný znak (*
) v třetím kroku označuje všechny uzly typu základního uzlu pro potomkovou osu. Typ hlavního uzlu osy určuje typ vybraných uzlů a název uzlu filtruje vybrané uzly.
V důsledku toho, když se tento výraz spustí na dokumentech XML katalogu produktů v tabulce ProductModel, načte všechny podřízené uzly prvků elementu <Funkce>, které jsou podřízenými uzly elementu <ProductDescription>.
Výraz cesty /child::PD:ProductDescription/attribute::ProductModelID
se skládá ze dvou kroků. Oba tyto kroky specifikují název uzlu jako parametr testu uzlu. Druhý krok také používá osu atributu. Každý krok proto vybere uzly typu hlavního uzlu jeho osy, která má název zadaný jako test uzlu. Tímto výrazem se vrátí uzel atributu ProductModelID a uzel prvku <ProductDescription>.
Při zadávání názvů uzlů pro testy uzlů můžete také použít zástupný znak (*) k zadání místního názvu uzlu nebo jeho předpony oboru názvů, jak je znázorněno v následujícím příkladu:
declare @x xml
set @x = '
<greeting xmlns="ns1">
<salutation>hello</salutation>
</greeting>
<greeting xmlns="ns2">
<salutation>welcome</salutation>
</greeting>
<farewell xmlns="ns1" />'
select @x.query('//*:greeting')
select @x.query('declare namespace ns="ns1"; /ns:*')
Typ uzlu jako test uzlu
Pokud chcete zadat dotaz na jiné typy uzlů než uzly prvků, použijte test typu uzlu. Jak je znázorněno v následující tabulce, jsou k dispozici čtyři testy typu uzlu.
Typ uzlu | Návraty | Příklad |
---|---|---|
comment() |
Platí pro uzel komentáře. |
following::comment() vybere všechny uzly komentářů, které se vyskytují za kontextovým uzlem. |
node() |
Platí pro uzel jakéhokoli druhu. |
preceding::node() vybere všechny uzly, které se zobrazí před kontextový uzel. |
processing-instruction() |
True pro uzel instrukce zpracování. |
self::processing instruction() vybere všechny uzly instrukce zpracování v rámci kontextového uzlu. |
text() |
Pravda pro textový uzel. |
child::text() vybere textové uzly, které jsou podřízené kontextovém uzlu. |
Pokud je typ uzlu, například text() nebo comment() ..., zadán jako test uzlu, vrátí krok pouze uzly zadaného typu bez ohledu na typ hlavního uzlu osy. Například následující výraz cesty vrátí pouze uzly komentáře, které jsou potomky kontextového uzlu:
child::comment()
Podobně /child::ProductDescription/child::Features/child::comment()
načte uzly komentářů, které jsou dětmi uzlu prvku <Funkce> uzlu prvku <PopisVýrobku>.
Příklady
Následující příklady porovnávají název uzlu a druh uzlu.
A. Výsledky zadání názvu uzlu a typu uzlu jako testů uzlů ve výrazu cesty
V následujícím příkladu je jednoduchý dokument XML přiřazen k proměnné typu xml. Dokument se dotazuje pomocí různých výrazů cesty. Výsledky se pak porovnávají.
declare @x xml
set @x='
<a>
<b>text1
<c>text2
<d>text3</d>
</c>
</b>
</a>'
select @x.query('
/child::a/child::b/descendant::*
')
Tento výraz žádá o uzly následnických prvků uzlu elementu <b>
.
Hvězdička (*
) v testu uzlu označuje zástupný znak pro název uzlu. Osa potomků má uzel elementu jako jeho primární druh uzlu. Výraz proto vrátí všechny uzly následnických elementů uzlu elementu <b>
. To znamená, že jsou vráceny 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 určení podřízené osy zadáte sestupnou osu nebo vlastní osu, vrátí se kontextový uzel a také jeho potomky:
/child::a/child::b/descendant-or-self::*
Tento výraz vrátí uzel elementu <b>
a jeho následné uzly elementů. Při vracení následnických uzlů určuje druh primárního uzlu osy "potomek-nebo-já", typem uzlu elementu, jaký druh uzlů se vrátí.
Toto je výsledek:
<b>text1
<c>text2
<d>text3</d>
</c>
</b>
<c>text2
<d>text3</d>
</c>
<d>text3</d>
Předchozí výraz použil zástupný znak jako název uzlu. Místo toho můžete použít funkci node()
, jak je znázorněno v tomto výrazu:
/child::a/child::b/descendant::node()
Protože node()
je typ uzlu, obdržíte všechny uzly na ose potomků. Toto je výsledek:
text1
<c>text2
<d>text3</d>
</c>
text2
<d>text3</d>
text3
Opět platí, že pokud jako test uzlu zadáte osu potomků nebo sebe sama a node()
, obdržíte všechny potomky, prvky a textové uzly a také kontextový uzel, element <b>
.
<b>text1
<c>text2
<d>text3</d>
</c>
</b>
text1
<c>text2
<d>text3</d>
</c>
text2
<d>text3</d>
text3
B. Zadání názvu uzlu v testu uzlu
Následující příklad určuje název uzlu jako test uzlu ve všech výrazech cesty. Výsledkem je, že všechny výrazy vracejí uzly hlavního druhu uzlu na ose, které mají název uzlu uvedený v testu uzlu.
Následující výraz dotazu vrátí prvek <Warranty
> z dokumentu XML katalogu produktů uložených v tabulce Production.ProductModel
:
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";
/child::PD:ProductDescription/child::PD:Features/child::wm:Warranty
')
FROM Production.ProductModel
WHERE ProductModelID=19
Všimněte si následujících věcí z předchozího dotazu:
Klíčové slovo
namespace
v prologu XQuery definuje předponu použitou v textu dotazu. Další informace o XQuery prolog naleznete v tématu XQuery Prolog .Všechny tři kroky ve výrazu cesty určují podřízenou osu a název uzlu jako test uzlu.
Volitelná součást kvalifikátoru kroku osy není určena v žádném z kroků ve výrazu.
Dotaz vrátí prvky <Warranty
>, které jsou podřízené prvku <Features
>, který je podřízený prvku <ProductDescription
>.
Toto je výsledek:
<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>
V následujícím dotazu výraz 'path expression' specifikuje zástupný znak (*
) pro test uzlu.
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";
/child::PD:ProductDescription/child::PD:Features/child::*
')
FROM Production.ProductModel
WHERE ProductModelID=19
Pro název uzlu je určen zástupný znak. Dotaz tedy vrátí všechny uzlové elementy, které jsou podřazené k uzlu <Features
>, jenž je sám podřazený k uzlu <ProductDescription
>.
Následující dotaz je podobný předchozímu dotazu s tím rozdílem, že společně se zástupným znakem je specifikován obor názvů. V důsledku toho se vrátí všechny podřízené prvky uzlu v daném oboru názvů. Všimněte si, že prvek <Features
> může obsahovat prvky z různých oborů názvů.
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";
/child::PD:ProductDescription/child::PD:Features/child::wm:*
')
FROM Production.ProductModel
WHERE ProductModelID=19
Zástupný znak můžete použít jako předponu oboru názvů, jak je uvedeno v tomto dotazu:
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";
/child::PD:ProductDescription/child::PD:Features/child::*:Maintenance
')
FROM Production.ProductModel
WHERE ProductModelID=19
Tento dotaz vrátí podřízené položky prvku <Maintenance
> ve všech oborech názvů z dokumentu XML katalogu produktů.
C. Určení typu uzlu v testu uzlu
Následující příklad určuje druh uzlu jako test uzlu ve všech výrazech cesty. Výsledkem je, že všechny výrazy vracejí uzly typu zadaného v testu uzlu.
Výraz cesty v následujícím dotazu určuje druh uzlu v jeho třetím kroku:
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";
/child::PD:ProductDescription/child::PD:Features/child::text()
')
FROM Production.ProductModel
WHERE ProductModelID=19
V dalším dotazu je zadáno následující:
Výraz cesty má tři kroky, které jsou oddělené lomítkem (
/
).Každý z těchto kroků určuje podřízenou osu.
První dva kroky určují název uzlu jako test uzlu a třetí krok určuje druh uzlu jako test uzlu.
Výraz vrátí textové uzly, které jsou podřízenými prvky elementu <
Features
>, který je podřízen prvku <ProductDescription
>.
Vrátí se pouze jeden textový uzel. Toto je výsledek:
These are the product highlights.
Následující dotaz vrátí podřízené položky uzlu komentáře elementu <ProductDescription
>:
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";
/child::PD:ProductDescription/child::comment()
')
FROM Production.ProductModel
WHERE ProductModelID=19
Všimněte si následujících věcí z předchozího dotazu:
Druhý krok určuje typ uzlu pro test uzlu.
Výsledkem je, že výraz vrátí komentářové podřízené uzly uzlů prvků <
ProductDescription
>.
Toto je výsledek:
<!-- add one or more of these elements... one for each specific product in this product model -->
<!-- add any tags in <specifications> -->
Následující dotaz získá uzly nejvyšší úrovně, které obsahují instrukce pro zpracování:
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";
/child::processing-instruction()
')
FROM Production.ProductModel
WHERE ProductModelID=19
Toto je výsledek:
<?xml-stylesheet href="ProductDescription.xsl" type="text/xsl"?>
Řetězcový literálový parametr můžete předat testu uzlu processing-instruction()
. V tomto případě dotaz vrátí pokyny pro zpracování, jejichž hodnota atributu názvu je řetězcový literál zadaný v argumentu.
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";
/child::processing-instruction("xml-stylesheet")
')
FROM Production.ProductModel
WHERE ProductModelID=19
Omezení implementace
Následují konkrétní omezení.
Rozšířené testy uzlů SequenceType nejsou podporovány.
processing-instruction(name) se nepodporuje. Místo toho zadejte název do uvozovek.