Aracılığıyla paylaş


Yol İfadeleri - Düğüm Testini Belirtme

Şunlar için geçerlidir: SQL Server

Yol ifadesindeki eksen adımı aşağıdaki bileşenleri içerir:

Daha fazla bilgi için bkz. Yol İfadeleri (XQuery).

Düğüm testi bir koşuldur ve yol ifadesindeki eksen adımının ikinci bileşenidir. Bir adım tarafından seçilen tüm düğümler bu koşulu karşılamalıdır. /child::ProductDescriptioniçin yol ifadesi, düğüm testi ProductDescription. Bu adım yalnızca adı ProductDescription olan öğe düğümü alt öğelerini alır.

Düğüm test koşulu aşağıdakileri içerebilir:

  • Düğüm adı. Yalnızca belirtilen ada sahip asıl düğüm türünün düğümleri döndürülür.

  • Düğüm türü. Yalnızca belirtilen türdeki düğümler döndürülür.

Not

XQuery yol ifadelerinde belirtilen düğüm adları, Transact-SQL sorgularıyla aynı sıralama duyarlı kurallara tabi değildir ve daima büyük/küçük harf duyarlıdır.

Düğüm Testi Olarak Düğüm Adı

Yol ifadesi adımında düğüm adını düğüm testi olarak belirtirken, asıl düğüm türü kavramını anlamanız gerekir. Her ekseni, alt öğe, üst öğe veya öznitelik, bir asıl düğüm türüne sahiptir. Örneğin:

  • Öznitelik ekseni yalnızca öznitelikler içerebilir. Bu nedenle, öznitelik düğümü öznitelik ekseninin asıl düğüm türüdür.

  • Diğer eksenler için, eksen tarafından seçilen düğümler öğe düğümleri içerebiliyorsa, öğe bu eksen için asıl düğüm türüdür.

Düğüm testi olarak bir düğüm adı belirttiğinizde, adım aşağıdaki düğüm türlerini döndürür:

  • Eksenin ana düğüm türüne ait olan düğümler.

  • Node testinde belirtilen adla aynı adı taşıyan düğümler.

Örneğin, aşağıdaki yol ifadesini göz önünde bulundurun:

child::ProductDescription   

Bu tek adımlı ifade, bir child ekseni ve düğüm testi olarak düğüm adı ProductDescription belirtir. İfade yalnızca alt eksenin, öğe düğümlerinin asıl düğüm türünde olan ve adı ProductDescription olan düğümleri döndürür.

/child::PD:ProductDescription/child::PD:Features/descendant::*, yol ifadesinin üç adımı vardır. Bu adımlar çocuk ve torun eksenleri belirtir. Her adımda düğüm adı düğüm testi olarak belirtilir. Üçüncü adımdaki joker karakter (*), alt eksen için ilke düğümü türünün tüm düğümlerini gösterir. Eksenin asıl düğüm türü, seçilen düğümlerin türünü belirler ve düğüm adı seçilen düğümleri filtreler.

Sonuç olarak, bu ifade ProductModel tablosundaki ürün kataloğu XML belgelerine karşı yürütüldüğünde, <ProductDescription> öğesinin <Özellikler> öğe düğümü alt öğesinin tüm öğe düğümü çocuklarını alır.

/child::PD:ProductDescription/attribute::ProductModelIDyol ifadesi iki adımdan oluşur. Bu adımların her ikisi de düğüm testi olarak bir düğüm adı belirtir. Ayrıca, ikinci adım öznitelik eksenini kullanır. Bu nedenle, her adım, adı belirtilen düğüm testi olan eksenin ana düğüm türüne ait düğümleri seçer. Bu nedenle ifade, ProductDescription< öğe düğümünün > öznitelik düğümünü döndürür.

Düğüm testleri için düğüm adlarını belirtirken, aşağıdaki örnekte gösterildiği gibi bir düğümün yerel adını veya ad alanı ön ekini belirtmek için joker karakteri (*) de kullanabilirsiniz:

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

Düğüm Testi Olarak Düğüm Türü

Öğe düğümleri dışındaki düğüm türlerini sorgulamak için bir düğüm türü testi kullanın. Aşağıdaki tabloda gösterildiği gibi, dört düğüm türü testi mevcuttur.

Düğüm türü İadeler Örnek
comment() Bir açıklama düğümü için true. following::comment() bağlam düğümünden sonra görünen tüm açıklama düğümlerini seçer.
node() Her türlü düğüm için doğru. preceding::node() bağlam düğümünden önce görünen tüm düğümleri seçer.
processing-instruction() İşletim yönerge düğümü için doğru. self::processing instruction() bağlam düğümündeki tüm işleme yönerge düğümlerini seçer.
text() Metin düğümü için 'True' değeri geçerlidir. child::text() bağlam düğümünün alt öğeleri olan metin düğümlerini seçer.

Text() veya comment() ...gibi düğüm türü düğüm testi olarak belirtilirse, adım eksenin asıl düğüm türünden bağımsız olarak yalnızca belirtilen türde düğümleri döndürür. Örneğin, aşağıdaki yol ifadesi yalnızca bağlam düğümünün açıklama düğümü alt öğelerini döndürür:

child::comment()  

Benzer şekilde, /child::ProductDescription/child::Features/child::comment()<ProductDescription> öğe düğümünün <Özellikler> öğe düğümü alt öğesinin yorum düğümü alt öğelerini alır.

Örnekler

Aşağıdaki örnekler düğüm adını ve düğüm türünü karşılaştırır.

A. Yol ifadesinde düğüm adını ve düğüm türünü düğüm testi olarak belirtmenin sonuçları

Aşağıdaki örnekte, xml türü değişkenine basit bir XML belgesi atanır. Belge farklı yol ifadeleri kullanılarak sorgulanır. Ardından sonuçlar karşılaştırılır.

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

Bu ifade, <b> öğe düğümünün alt öğe düğümlerini ister.

Düğüm testindeki yıldız işareti (*), düğüm adı için joker karakter olduğunu gösterir. Alt eksen, birincil düğüm türü olarak öğe düğümünü kullanır. Bu nedenle, ifade <b>öğe düğümünün tüm alt öğe düğümlerini döndürür. Diğer bir ifadeyle, aşağıdaki sonuçta gösterildiği gibi öğe düğümleri <c> ve <d> döndürülür:

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

Alt eksen belirtmek yerine bir alt veya kendi ekseni belirtirseniz, bağlam düğümü döndürülür ve alt öğeleri de döndürülür:

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

Bu ifade <b> öğe düğümünü ve alt öğe düğümlerini döndürür. Alt düğümleri döndürürken, alt veya kendi ekseninin birincil düğüm türü olan öğe düğümü türü, ne tür düğümlerin döndürüleceğini belirler.

Sonuç şu şekildedir:

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

Önceki ifadede düğüm adı olarak joker karakter kullanılmıştır. Bunun yerine, bu ifadede gösterildiği gibi node() işlevini kullanabilirsiniz:

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

node() bir düğüm türü olduğundan, alt eksenin tüm düğümlerini alırsınız. Sonuç şu şekildedir:

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

Yine, düğüm testi olarak descendant-or-self eksenini ve node() belirtirseniz, tüm alt düğümleri, öğeleri ve metin düğümlerini, ayrıca bağlam düğümü olan <b> öğesini alırsınız.

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

B. Düğüm testinde düğüm adı belirtme

Aşağıdaki örnek, tüm yol ifadelerinde düğüm testi olarak bir düğüm adı belirtir. Sonuç olarak, tüm ifadeler düğüm testinde belirtilen düğüm adına sahip eksenin asıl düğüm türünün düğümlerini döndürür.

Aşağıdaki sorgu ifadesi, < tablosunda depolanan ürün kataloğu XML belgesinden Warranty>Production.ProductModel öğesini döndürür:

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  

Önceki sorgudan aşağıdakilere dikkat edin:

  • XQuery günlüğündeki namespace anahtar sözcüğü, sorgu gövdesinde kullanılan bir ön ek tanımlar. XQuery prologu hakkında daha fazla bilgi için bkz. XQuery Prolog .

  • Yol ifadesindeki üç adımın tümü, düğüm testi olarak alt ekseni ve bir düğüm adını belirtir.

  • Eksen adımının isteğe bağlı adım niteleyicisi bölümü, ifadedeki adımların hiçbirinde belirtilmez.

Sorgu, <Warranty> öğesinin <Features> öğesi alt öğesinin <ProductDescription> öğesi çocuklarını döndürür.

Sonuç şu şekildedir:

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

Aşağıdaki sorguda, yol ifadesi düğüm testinde joker karakter (*) belirtir.

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  

Düğüm adı için bir joker karakter belirtilir. Bu nedenle sorgu, <Features> öğe düğümünün <ProductDescription> alt düğümünün tüm öğe düğümü çocuklarını döndürür.

Aşağıdaki sorgu önceki sorguya benzer ancak joker karakterle birlikte bir ad alanı belirtilir. Sonuç olarak, bu ad alanındaki tüm öğe düğümlerinin alt öğeleri döndürülür. < Features > öğesinin farklı ad alanlarına ait öğeler içerebileceğini unutmayı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::PD:ProductDescription/child::PD:Features/child::wm:*  
')  
FROM Production.ProductModel  
WHERE ProductModelID=19  

Joker karakteri, bu sorguda gösterildiği gibi, bir ad alanı ön eki olarak kullanılabilir.

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  

Bu sorgu, ürün kataloğu XML belgesindeki tüm ad alanları içindeki <Maintenance> öğe düğümü alt öğelerini döndürür.

C. Düğüm testinde düğüm türünü belirtme

Aşağıdaki örnek, düğüm türünü tüm yol ifadelerinde düğüm testi olarak belirtir. Sonuç olarak, tüm ifadeler düğüm testinde belirtilen türde düğümler döndürür.

Aşağıdaki sorguda yol ifadesi üçüncü adımında bir düğüm türünü belirtir:

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  

Sonraki sorguda aşağıdakiler belirtilir:

  • Yol ifadesinin eğik çizgi işaretiyle ayrılmış üç adımı vardır (/).

  • Bu adımların her biri bir alt eksen belirtir.

  • İlk iki adım düğüm testi olarak bir düğüm adı, üçüncü adım ise düğüm testi olarak bir düğüm türü belirtir.

  • İfade, <Features> öğe düğümünün <ProductDescription> öğesi alt öğesinin metin düğümü alt öğelerini döndürür.

Yalnızca bir metin düğümü döndürülür. Sonuç şu şekildedir:

These are the product highlights.   

Aşağıdaki sorgu, <ProductDescription> öğesinin yorum düğümü alt öğelerini döndürür.

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  

Önceki sorgudan aşağıdakilere dikkat edin:

  • İkinci adım, düğüm testi olarak bir düğüm türünü belirtir.

  • Sonuç olarak ifade, <ProductDescription> öğe düğümlerinin açıklama düğümü alt öğelerini döndürür.

Sonuç şu şekildedir:

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

Aşağıdaki sorgu en üst düzey işleme yönergesi düğümlerini alır:

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  

Sonuç şu şekildedir:

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

processing-instruction() düğüm testine bir karakter dizisi literalı parametresi geçirebilirsiniz. Bu durumda, sorgu, ad özniteliği değeri sorgu argümanında belirtilen dize değişmez değeri olan işleme yönergelerini döndürür.

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  

Uygulama Sınırlamaları

Belirli sınırlamalar aşağıdadır

  • Genişletilmiş SequenceType düğüm testleri desteklenmez.

  • processing-instruction(name) desteklenmez. Bunun yerine, adı tırnak içine koyun.