Udostępnij przez


Określanie Test węzłów w kroku wyrażenie ścieżki

Wkrocz oś ścieżka wyrażenie zawiera następujące składniki:

Aby uzyskać więcej informacji, zobacz Ścieżka wyrażeń (XQuery).

Test węzłów jest warunek i krok drugi składnik oś ścieżka wyrażenia.Wszystkie węzły zaznaczone krok musi spełniają ten warunek.Wyrażenie ścieżka /child::ProductDescription, test węzłów jest ProductDescription.W tym kroku pobiera elementów tylko tych elementów podrzędnych węzłów którego nazwa jest ProductDescription.

Warunki badania węzła mogą być następujące:

  • Nazwa węzła.Zwracane są tylko węzłów typu główny węzeł o określonej nazwie.

  • Typ węzła.Zwracane są tylko węzły określonego typu.

Ostrzeżenie

Nazwy węzła, które są określone w wyrażeniach ścieżka XQuery nie podlegają tym samym regułom liter sortowanie języka Transact-SQL kwerendy są i są zawsze przypadek-poufne.

Nazwa węzła jako Test węzłów

Podczas określania nazwy węzeł jako węzeł przetestować w kroku wyrażenie ścieżka, należy zrozumieć pojęcie rodzaju węzła głównego.Każdej oś, podrzędność, nadrzędnego lub atrybut, ma typ węzła głównego.Na przykład:

  • Oś atrybut może zawierać tylko atrybuty.Dlatego węzeł atrybut jest węzeł główny rodzaj oś atrybut.

  • Dla pozostałych osi Jeśli węzły zaznaczone przez oś może zawierać węzły elementu element jest typu węzeł główny dla tej osi.

Po określeniu nazwy węzła jako test węzłów krok zwraca następujące typy węzłów:

  • Węzły areof tego rodzaju węzłów głównych oś.

  • Węzły, które mają taką samą nazwę, jak określono w badaniu węzła.

Na przykład rozważmy następujące wyrażenie ścieżka:

child::ProductDescription 

Określa wyrażenie umożliwiający child oś i nazwa węzła ProductDescription jako rozgrzanych węzłaWyrażenie zwraca tylko węzłów, które są tego rodzaju węzłów głównych oś podrzędność węzły elementów, których ProductDescription jako swojej nazwy.

Wyrażenie ścieżka /child::PD:ProductDescription/child::PD:Features/descendant::*, ma trzy kroki.Te kroki należy określić osi podrzędność i elementów podrzędność.W każdym kroku nazwa węzła jest określona jako test węzłów.Symbol wieloznaczny (*) w trzecim kroku wskazuje wszystkie węzły tego rodzaju węzeł Zasady dla podrzędnych oś.Węzeł główny rodzaj oś określa typ węzły zaznaczone i filtry nazwę węzła, które węzły zaznaczone.

W wyniku po to wyrażenie jest wykonywane dokumentów XML wykazu produktów w ProductModel tabela pobiera wszystkie podrzędność węzeł elementu z <funkcje> element podrzędność węzeł <ProductDescription> element.

Wyrażenie ścieżka /child::PD:ProductDescription/attribute::ProductModelID, składa się z dwóch kroków.Oba te kroki określić nazwę węzła jako test węzłów.Ponadto drugi krok używa oś atrybut.Dlatego każdy krok wybiera węzłów węzeł główny rodzaj oś o nazwie określonej jako test węzłów.W efekcie wyrażenie zwraca ProductModelID węzeł atrybut <ProductDescription> węzeł elementu.

Określając nazwy węzłów dla testów węźle umożliwia także symbol wieloznaczny (*) do określenia nazwy lokalnego węzła lub jego prefiks obszaru nazw jak pokazano w następującym przykładzie:

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 węzła jako Test węzłów

Dla węzła typu innego niż element węzłów kwerendy za pomocą testu typu węzła.Jak pokazano w poniższej tabela, istnieją cztery badania typu węzła dostępne.

Typ węzła

Zwraca

Przykład

comment()

Wartość true dla węzła komentarz.

following::comment()Zaznacza wszystkie węzły komentarz występujących po węzeł kontekstu.

node()

Wartość true dla węzła wszelkiego rodzaju.

preceding::node()Zaznacza wszystkie węzły, które pojawiają się przed węzeł kontekstu.

processing-instruction()

Wartość true dla węzła instrukcji przetwarzania.

self::processing instruction()Zaznacza wszystkie węzły instrukcji przetwarzania w węźle kontekstu.

text()

Wartość true dla węzła tekstu.

child::text()wybiera węzłów tekstowych, które są dzieci węzeł kontekstu.

Jeśli określony typ węzła, na przykład text() lub comment(),..., jako test węzłów, krok po prostu zwraca węzłów określonego rodzaju, niezależnie od węzła głównego rodzaju oś.Na przykład następujące wyrażenie ścieżka zwraca tylko dzieci węzła komentarz węzła kontekstowego:

child::comment()

Podobnie /child::ProductDescription/child::Features/child::comment() pobiera komentarz podrzędność węzeł <Funkcje> element podrzędność węzeł <ProductDescription> węzeł elementu.

Przykłady

Następujące przykłady porównać nazwy węzła i rodzaju węzła.

A.Wyniki określania nazwy węzła i typu węzeł jako węzeł testy w ścieżka wyrażenia

W poniższym przykładzie prosty dokument XML jest przypisany do xml typu zmiennej.Dokument jest zbadać za pomocą wyrażenia inną ścieżka.Wyniki są porównywane.

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

To wyrażenie prosi o węzły podrzędne elementu <b> węzeł elementu.

Gwiazdka (*) w węźle test wskazuje symbol wieloznaczny dla nazwy węzła.Podrzędne oś ma węzeł elementu jako rodzaju węzła głównego.Dlatego wyrażenie zwraca wszystkie węzły podrzędne elementu węzeł elementu <b>.Element węzłami <c> i <d> są zwracane zgodnie z następujący wynik:

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

Jeśli Określ oś potomne lub self zamiast określania osi podrzędne, węzeł kontekstu jest zwracany, a także jego elementy podrzędne:

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

To wyrażenie zwraca węzeł elementu <b> i jego węzły podrzędne elementu.W zwracać węzły podrzędne, węzeł podstawowy rodzaj oś obiektu podrzędnego lub self typu węzeł elementu, określa, jakiego rodzaju węzły są zwracane.

Jest to wynikiem:

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

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

<d>text3</d> 

Poprzednie wyrażenie użyć symbolu wieloznacznego jako nazwa węzła.Zamiast tego można użyć node() funkcja jako pokaz w tym wyrażenie:

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

Ponieważ node() jest typ węzła otrzyma wszystkie węzły podrzędne oś.Jest to wynikiem:

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

Ponownie Jeśli określisz podrzędnym lub self oś i node() jako test węzłów otrzyma wszystkie elementy podrzędne, elementów i węzłów tekstowych i również węzeł kontekstu <b> elementu.

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

B.Określanie nazwy węzła w badaniu węzła

W następującym przykładzie określono nazwę węzła w węźle test w wyrażeniach ścieżka.W wyniku wszystkie wyrażenia zwraca węzłów węzeł główny rodzaj oś ma nazwę węzła określony w badaniu węzła.

Następujące kwerendy zwraca wyrażenie <Warranty> element z dokumentu XML wykazu produktów przechowywanych w Production.ProductModel tabela:

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

Poniższe z poprzedniej kwerendy:

  • namespace Słowo kluczowe w prologu XQuery definiuje prefiks, która jest używana w kwerendzie ciała.Aby uzyskać więcej informacji o prologu XQuery, zobacz XQuery prologu .

  • Wszystkie trzy kroki ścieżka wyrażenie określić jako test węzłów podrzędność osi i nazwa węzła.

  • Opcjonalne kwalifikator kroku część kroku oś nie jest określony w jakiejkolwiek czynności w wyrażenie.

Kwerenda zwraca <Warranty> elementy podrzędność elementu <Features> element podrzędność <ProductDescription> elementu.

Jest to wynikiem:

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

W następującej kwerendzie wyrażenie ścieżka Określa symbol wieloznaczny (*) w rozgrzanych węzła

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

Symbol wieloznaczny określono nazwę węzła.W efekcie kwerenda zwraca element węzeł podrzędność <Features> element podrzędność węzeł <ProductDescription> węzeł elementu.

Następująca kwerenda jest podobna do poprzedniej kwerendy, chyba, że wraz z symbolem wieloznacznym, określono obszaru nazw.W wyniku tego zwracane są wszystkie dzieci węzeł element w tym obszarze nazw.Należy zauważyć, że <Features> element może zawierać elementy z różnych obszarów nazw.

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

Jako prefiks obszaru nazw można użyć znaku wieloznacznego, jak pokazano w tej kwerendzie:

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

Ta kwerenda zwraca <Maintenance> dzieci węzeł elementu wszystkie obszary nazw z dokumentu XML wykazu produktów.

C.Określanie rodzaju węzła w badaniu węzła

W poniższym przykładzie określa rodzaj węzeł jako węzeł badania w wyrażeniach ścieżka.Wszystkie wyrażenia zwraca w wyniku węzłów typu określonego w węźle test.

W następującej kwerendzie wyrażenie ścieżka Określa rodzaj węzła w jego trzeci krok:

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

W następnej kwerendzie poniżej określono:

  • Wyrażenie ścieżka ma trzy kroki oddzielone kreską (/).

  • Każdy z tych kroków Określa oś podrzędność.

  • Dwa pierwsze kroki określ nazwę węzła jako test węzłów, a trzeci krok określa rodzaj węzeł jako test węzłów.

  • Wyrażenie zwraca tekst węzła podrzędność <Features> element podrzędność <ProductDescription> węzeł elementu.

Zwracany jest tekst tylko jeden węzeł.Jest to wynikiem:

These are the product highlights. 

Następująca kwerenda zwraca komentarz dzieci węzeł <ProductDescription> element:

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

Poniższe z poprzedniej kwerendy:

  • Drugi krok określa rodzaj węzeł jako test węzłów.

  • W wyniku wyrażenie zwraca komentarz dzieci węzeł <ProductDescription> elementu węzłów.

Jest to wynikiem:

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

Następująca kwerenda pobiera węzłów najwyższego poziom, instrukcję przetwarzania:

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

Jest to wynikiem:

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

Można przekazać ciąg literału parametr processing-instruction() rozgrzanych węzłaW tym przypadek kwerenda zwraca instrukcje przetwarzania, których wartość atrybut nazwy jest literałem ciąg określonego w argumencie.

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

Ograniczenia wdrażania

Szczególne ograniczenia są następujące

  • Testy rozszerzone węzła SequenceType nie są obsługiwane.

  • processing-instruction(Name) nie jest obsługiwane.Zamiast tego należy ująć nazwę w cudzysłów.