Megosztás:


Elérésiút-kifejezések – Csomópontteszt megadása

A következőkre vonatkozik:SQL Server

Egy elérésiút-kifejezés tengelylépése a következő összetevőket foglalja magában:

További információ: Path Expressions (XQuery).

A csomópont-teszt egy feltétel, és a tengelylépés második összetevője egy útvonal-kifejezésben. A lépésben kiválasztott összes csomópontnak meg kell felelnie ennek a feltételnek. Az elérési út kifejezéséhez /child::ProductDescription, a csomópontteszt: ProductDescription. Ez a lépés csak azokat az elemcsomópont-gyermekeket kéri le, akiknek a neve ProductDescription.

A csomóponttesztelési feltétel a következőket tartalmazhatja:

  • Csomópont neve. Csak a megadott nevű főcsomópontok kerülnek visszaadásra.

  • Csomóponttípus. A rendszer csak a megadott típusú csomópontokat adja vissza.

Jegyzet

Az XQuery elérési út kifejezésekben megadott csomópontnevek nem tartoznak ugyanolyan érzékeny összehasonlítási szabályok alá, mint a Transact-SQL lekérdezések, és mindig kis- és nagybetű-érzékenyek.

Csomópont neve csomóponttesztként

Amikor csomópontnevet ad meg csomóponttesztként egy elérésiút-kifejezési lépésben, meg kell értenie a fő csomóponttípus fogalmát. Minden tengely, gyermek, szülő vagy attribútum rendelkezik fő csomópont típussal. Például:

  • Az attribútumtengelyek csak attribútumokat tartalmazhatnak. Ezért az attribútumcsomópont az attribútumtengely fő csomóponttípusa.

  • Más tengelyek esetében, ha a tengely által kijelölt csomópontok tartalmazhatnak elemcsomópontokat, az elem az adott tengely fő csomóponttípusa.

Ha csomópontnevet ad meg csomóponttesztként, a lépés a következő csomóponttípusokat adja vissza:

  • A tengely fő csomóponttípusához tartozó csomópontok.

  • Azok a csomópontok, amelyek neve megegyezik a csomóponttesztben megadott névvel.

Vegyük például a következő elérésiút-kifejezést:

child::ProductDescription   

Ez az egylépéses kifejezés egy child tengelyt és a csomópont nevét, ProductDescription-et mint csomóponttesztet határoz meg. A kifejezés csak azokat a csomópontokat adja vissza, amelyek a gyermektengely, elemcsomópontok fő csomóponttípusához tartoznak, és amelyek neve ProductDescription.

A /child::PD:ProductDescription/child::PD:Features/descendant::*, elérési út kifejezésének három lépése van. A következő lépések a gyermek- és leszármazott tengelyeket határozzák meg. Minden lépésben a csomópont neve lesz megadva csomóponttesztként. A harmadik lépésben a helyettesítő karakter (*) az alaptípusú csomópont minden csomópontját jelzi a leszármazási tengely számára. A tengely fő csomóponttípusa határozza meg a kijelölt csomópontok típusát, és a csomópont neve szűri a kijelölt csomópontokat.

Ennek eredményeképpen, amikor ezt a kifejezést végrehajtják a ProductModel táblában lévő termékkatalógus XML-dokumentumokon, lekéri a <ProductDescription> elem <Features> elemcsomópont-gyermekének összes elemcsomópont-gyermekét.

Az elérési út kifejezés (/child::PD:ProductDescription/attribute::ProductModelID) két lépésből áll. Mindkét lépés csomópont-tesztként megadja a csomópont nevét. A második lépés az attribútumtengelyt is használja. Ezért minden lépés kiválasztja a tengelye fő csomóponttípusának csomópontjait, amelyeknek a neve a csomóponttesztként van megadva. A kifejezés így ProductModelID attribútumcsomópontot adja vissza a <ProductDescription> elemcsomóponthoz.

A csomóponttesztekhez használt csomópontok nevének megadásakor a helyettesítő karakter (*) használatával is megadhatja a csomópont vagy a névtér előtagjának helyi nevét, ahogyan az az alábbi példában látható:

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:*')  

Csomóponttípus csomóponttesztként

Az elemcsomópontoktól eltérő csomóponttípusok lekérdezéséhez használjon csomóponttípus-tesztet. Az alábbi táblázatban látható módon négy csomóponttípus-teszt érhető el.

Csomópont típusa Visszatér Példa
comment() Megjegyzéscsomópont esetén igaz. following::comment() kijelöli a környezeti csomópont után megjelenő összes megjegyzéscsomópontot.
node() Bármilyen csomópont esetén igaz. preceding::node() kijelöli a környezeti csomópont előtt megjelenő összes csomópontot.
processing-instruction() Igaz egy feldolgozási utasításcsomópontra. self::processing instruction() kijelöli a környezeti csomóponton belüli összes feldolgozási utasításcsomópontot.
text() Szövegcsomópont esetén igaz. child::text() kijelöli a kontextus csomópont gyermekeinek szövegcsomópontjait.

Ha a csomóponttípus ( például szöveg() vagy megjegyzés() ...) csomóponttesztként van megadva, a lépés csak a megadott típusú csomópontokat adja vissza, függetlenül a tengely fő csomóponttípusától. Például az alábbi útvonal-kifejezés csak a kontextus csomópont kommentcsomópont gyermekeit adja vissza.

child::comment()  

Hasonlóképpen, /child::ProductDescription/child::Features/child::comment() a <ProductDescription> elemcsomóponthoz tartozó <Szolgáltatások> elemcsomópont gyermekének megjegyzéscsomópont-gyermekeit kéri le.

Példák

Az alábbi példák a csomópont nevét és a csomóponttípust hasonlítják össze.

Egy. A csomópontnév és a csomóponttípus csomóponttesztként való megadásának eredményei egy elérésiút-kifejezésben

Az alábbi példában egy egyszerű XML-dokumentum van hozzárendelve egy xml- típusú változóhoz. A dokumentum lekérdezése különböző elérésiút-kifejezések használatával történik. A rendszer ezután összehasonlítja az eredményeket.

declare @x xml  
set @x='  
<a>  
 <b>text1  
   <c>text2  
     <d>text3</d>  
   </c>  
 </b>  
</a>'  
select @x.query('  
/child::a/child::b/descendant::*  
')  

Ez a kifejezés a <b> elemcsomópont leszármazottelem-csomópontjait kéri.

A csomóponttesztben a csillag (*) a csomópontnév helyettesítő karakterét jelzi. A leszármazott tengely elsődleges csomóponttípusa az elemcsomópont. Ezért a kifejezés az <b>elemcsomópont összes leszármazóelem-csomópontját adja vissza. Ez azt jelenti, hogy az elemcsomópontok <c> és <d> lesznek visszaadva, ahogy az az alábbi eredményben is látható:

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

Ha a leszármazási tengely megadása helyett egy csökkenő vagy önálló tengelyt ad meg, a rendszer a környezeti csomópontot és annak leszármazottait is visszaadja:

/child::a/child::b/descendant-or-self::*  

Ez a kifejezés az elemcsomópontot <b> és annak leszármazottelem-csomópontjait adja vissza. A leszármazó csomópontok visszaadásakor a leszármazási vagy öntengely elsődleges csomóponttípusa, az elemcsomópont típusa határozza meg, hogy milyen típusú csomópontokat adnak vissza.

Ez az eredmény:

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

Az előző kifejezés egy helyettesítő karaktert használt csomópontnévként. Ehelyett használhatja a node() függvényt, ahogyan az ebben a kifejezésben látható:

/child::a/child::b/descendant::node()  

Mivel node() csomóponttípus, a leszármazott tengely összes csomópontját megkapja. Ez az eredmény:

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

Ha a csomóponttesztként megadja a leszármazó- vagy öntengelyt, és node(), az összes leszármazót, elemet és szöveges csomópontot, valamint a környezeti csomópontot, a <b> elemet fogja megkapni.

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

B. Csomópontnév megadása a csomóponttesztben

Az alábbi példa egy csomópontnevet ad meg csomóponttesztként az összes elérésiút-kifejezésben. Ennek eredményeképpen az összes kifejezés a tengely fő csomóponttípusának olyan csomópontjait adja vissza, amelyek a csomóponttesztben megadott csomópontnévvel rendelkeznek.

A következő lekérdezési kifejezés a Production.ProductModel táblában tárolt termékkatalógus XML-dokumentumának <Warranty> elemét adja vissza:

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  

Jegyezze fel az előző lekérdezésben szereplő következőket:

  • Az XQuery prolog namespace kulcsszója a lekérdezés törzsében használt előtagot határozza meg. További információ az XQuery prologról: XQuery Prolog.

  • Az elérésiút-kifejezés mindhárom lépése a gyermektengelyt és a csomópont nevét adja meg csomóponttesztként.

  • A tengelylépés választható lépés-minősítő része nincs megadva a kifejezés egyik lépésében sem.

A lekérdezés a <ProductDescription> elem <Features> elem gyermekének <Warranty> elemét adja vissza.

Ez az eredmény:

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

Az alábbi lekérdezésben az elérési út kifejezés egy helyettesítő karaktert (*) határoz meg egy csomóponttesztben.

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  

A csomópont nevéhez a helyettesítő karakter van megadva. Így a lekérdezés visszaadja a <ProductDescription> elemcsomópont <Features> elemcsomópont gyermekének összes elemcsomópontját.

Az alábbi lekérdezés hasonló az előző lekérdezéshez, azzal a kivétellel, hogy a helyettesítő karakterrel együtt meg van adva egy névtér. Ennek eredményeképpen a rendszer visszaadja a névtérben lévő összes elemcsomópont gyermekét. Vegye figyelembe, hogy a <Features> elem különböző névterek elemeit tartalmazhatja.

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  

A helyettesítő karaktert névtérelőtagként használhatja, ahogyan az ebben a lekérdezésben látható:

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  

Ez a lekérdezés a termékkatalógus XML-dokumentumának összes névterében visszaadja az <Maintenance> elemcsomópont gyermekeit.

C. Csomóponttípus megadása a csomóponttesztben

Az alábbi példa a csomóponttípust adja meg csomóponttesztként az összes elérésiút-kifejezésben. Ennek eredményeként az összes kifejezés a csomóponttesztben megadott típusú csomópontokat adja vissza.

Az alábbi lekérdezésben az elérési út kifejezése a csomóponttípust adja meg a harmadik lépésben:

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  

A következő lekérdezésben a következő van megadva:

  • Az elérésiút-kifejezés három lépést tartalmaz perjellel (/) elválasztva.

  • Mindegyik lépés egy gyermektengelyt jelöl meg.

  • Az első két lépés a csomópont nevét adja meg csomóponttesztként, a harmadik lépés pedig egy csomóponttípust határoz meg csomóponttesztként.

  • A kifejezés a <ProductDescription> elemcsomópont <Features> elem gyermekének szövegcsomópont-gyermekeit adja vissza.

A rendszer csak egy szöveges csomópontot ad vissza. Ez az eredmény:

These are the product highlights.   

Az alábbi lekérdezés a <ProductDescription> elem megjegyzéscsomó gyermekeit adja vissza:

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  

Jegyezze fel az előző lekérdezésben szereplő következőket:

  • A második lépés egy csomóponttípust határoz meg csomóponttesztként.

  • Ennek eredményeként a kifejezés a <ProductDescription> elemcsomópontok megjegyzéscsomópontjait adja vissza.

Ez az eredmény:

<!-- add one or more of these elements... one for each specific product in this product model -->  
<!-- add any tags in <specifications> -->      

A következő lekérdezés lekéri a legfelső szintű feldolgozási-utasítás csomópontokat:

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  

Ez az eredmény:

<?xml-stylesheet href="ProductDescription.xsl" type="text/xsl"?>   

A sztringkonstans paramétert átadhatja a processing-instruction() csomóponttesztnek. Ebben az esetben a lekérdezés azokat a feldolgozási utasításokat adja vissza, amelyek név attribútumának értéke az argumentumban megadott karakterlánc.

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  

Megvalósítási korlátozások

Az alábbiakban a konkrét korlátozásokat ismertetjük

  • A kiterjesztett SequenceType csomóponttesztek nem támogatottak.

  • A feldolgozási utasítás(név) nem támogatott. Ehelyett tegye a nevet idézőjelek közé.