Bagikan melalui


Ekspresi Jalur - Menentukan Pengujian Simpul

Berlaku untuk:SQL Server

Langkah sumbu dalam ekspresi jalur menyertakan komponen berikut:

Untuk informasi selengkapnya, lihat Ekspresi Jalur (XQuery).

Pengujian node adalah kondisi dan merupakan komponen kedua dari langkah sumbu dalam ekspresi jalur. Semua simpul yang dipilih oleh langkah harus memenuhi kondisi ini. Untuk ekspresi jalur, /child::ProductDescription, pengujian simpul adalah ProductDescription. Langkah ini hanya mengambil anak simpul elemen yang namanya ProductDescription.

Kondisi pengujian simpul dapat mencakup yang berikut ini:

  • Nama node. Hanya simpul dari jenis simpul utama dengan nama yang ditentukan yang dikembalikan.

  • Jenis node. Hanya simpul dari jenis yang ditentukan yang dikembalikan.

Catatan

Nama node yang ditentukan dalam ekspresi jalur XQuery tidak tunduk pada aturan sensitif kolase yang sama dengan kueri Transact-SQL dan selalu peka huruf besar/kecil.

Nama Simpul sebagai Uji Simpul

Saat menentukan nama node sebagai pengujian simpul dalam langkah ekspresi jalur, Anda harus memahami konsep jenis node utama. Setiap sumbu, anak, induk, atau atribut, memiliki jenis node utama. Contohnya:

  • Sumbu atribut hanya dapat berisi atribut. Oleh karena itu, node atribut adalah jenis node utama dari sumbu atribut.

  • Untuk sumbu lain, jika simpul yang dipilih oleh sumbu dapat berisi simpul elemen, elemen adalah jenis node utama untuk sumbu tersebut.

Saat Anda menentukan nama node sebagai pengujian simpul, langkah mengembalikan jenis node berikut:

  • Simpul yang merupakan jenis node utama dari sumbu.

  • Simpul yang memiliki nama yang sama seperti yang ditentukan dalam pengujian simpul.

Misalnya, pertimbangkan ekspresi jalur berikut:

child::ProductDescription   

Ekspresi satu langkah ini menentukan child sumbu dan nama ProductDescription simpul sebagai pengujian simpul. Ekspresi hanya mengembalikan simpul yang merupakan jenis node utama dari sumbu anak, node elemen, dan yang memiliki ProductDescription sebagai namanya.

Ekspresi jalur, /child::PD:ProductDescription/child::PD:Features/descendant::*, memiliki tiga langkah. Langkah-langkah ini menentukan sumbu turunan dan turunan. Dalam setiap langkah, nama simpul ditentukan sebagai pengujian simpul. Karakter kartubebas (*) pada langkah ketiga menunjukkan semua simpul jenis simpul prinsip untuk sumbu turunan. Jenis simpul utama sumbu menentukan jenis simpul yang dipilih, dan nama simpul memfilter simpul yang dipilih.

Akibatnya, ketika ekspresi ini dijalankan terhadap dokumen XML katalog produk dalam tabel ProductModel , ekspresi ini mengambil semua turunan <node elemen Fitur> dari <elemen ProductDescription> .

Ekspresi jalur, /child::PD:ProductDescription/attribute::ProductModelID, terdiri dari dua langkah. Kedua langkah ini menentukan nama simpul sebagai pengujian simpul. Selain itu, langkah kedua menggunakan sumbu atribut. Oleh karena itu, setiap langkah memilih simpul jenis node utama dari sumbunya yang memiliki nama yang ditentukan sebagai pengujian simpul. Dengan demikian, ekspresi mengembalikan node atribut ProductModelID dari node <elemen ProductDescription> .

Saat menentukan nama simpul untuk pengujian simpul, Anda juga dapat menggunakan karakter kartubebas (*) untuk menentukan nama lokal simpul atau untuk awalan namespace layanannya, seperti yang ditunjukkan dalam contoh berikut:

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

Jenis Node sebagai Uji Simpul

Untuk mengkueri jenis node selain node elemen, gunakan pengujian jenis node. Seperti yang ditunjukkan dalam tabel berikut, ada empat pengujian jenis node yang tersedia.

Jenis Simpul Mengembalikan Contoh
comment() Benar untuk node komentar. following::comment() memilih semua simpul komentar yang muncul setelah simpul konteks.
node() Benar untuk simpul dalam bentuk apa pun. preceding::node() memilih semua simpul yang muncul sebelum simpul konteks.
processing-instruction() Benar untuk simpul instruksi pemrosesan. self::processing instruction() memilih semua simpul instruksi pemrosesan dalam simpul konteks.
text() Benar untuk simpul teks. child::text() memilih simpul teks yang merupakan turunan dari simpul konteks.

Jika jenis node, seperti text() atau comment() ..., ditentukan sebagai pengujian node, langkah hanya mengembalikan simpul dari jenis yang ditentukan, terlepas dari jenis simpul utama sumbu. Misalnya, ekspresi jalur berikut hanya mengembalikan anak simpul komentar dari simpul konteks:

child::comment()  

Demikian pula, /child::ProductDescription/child::Features/child::comment() mengambil anak simpul komentar dari <anak simpul elemen Fitur> dari <node elemen ProductDescription> .

Contoh

Contoh berikut membandingkan nama node dan jenis node.

J. Hasil menentukan nama node dan jenis node sebagai pengujian simpul dalam ekspresi jalur

Dalam contoh berikut, dokumen XML sederhana ditetapkan ke variabel jenis xml . Dokumen dikueri dengan menggunakan ekspresi jalur yang berbeda. Hasilnya kemudian dibandingkan.

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

Ekspresi ini meminta node elemen turunan dari <b> node elemen.

Tanda bintang (*) dalam pengujian simpul menunjukkan karakter kartubebas untuk nama simpul. Sumbu turunan memiliki node elemen sebagai jenis node utamanya. Oleh karena itu, ekspresi mengembalikan semua node elemen turunan dari node <b>elemen . Artinya, node <c> elemen dan <d> dikembalikan, seperti yang ditunjukkan dalam hasil berikut:

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

Jika Anda menentukan sumbu descendent-or-self alih-alih menentukan sumbu turunan, , simpul konteks dikembalikan dan juga turunannya:

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

Ekspresi ini mengembalikan simpul <b> elemen dan node elemen turunannya. Dalam mengembalikan simpul turunan, jenis node utama dari sumbu turunan atau diri, jenis node elemen, menentukan jenis node apa yang dikembalikan.

Ini adalah hasilnya:

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

Ekspresi sebelumnya menggunakan karakter kartubebas sebagai nama simpul. Sebagai gantinya, Anda dapat menggunakan fungsi , seperti yang node() ditunjukkan dalam ekspresi ini:

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

Karena node() merupakan jenis node, Anda akan menerima semua simpul sumbu turunan. Ini adalah hasilnya:

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

Sekali lagi, jika Anda menentukan sumbu turunan atau diri dan node() sebagai tes simpul, Anda akan menerima semua simpul turunan, elemen, dan teks, dan juga node konteks, <b> elemen .

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

B. Menentukan nama simpul dalam pengujian simpul

Contoh berikut menentukan nama simpul sebagai pengujian simpul di semua ekspresi jalur. Akibatnya, semua ekspresi mengembalikan simpul dari jenis simpul utama dari sumbu yang memiliki nama node yang ditentukan dalam pengujian simpul.

Ekspresi kueri berikut mengembalikan <Warranty> elemen dari dokumen XML katalog produk yang Production.ProductModel disimpan dalam tabel:

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  

Perhatikan hal berikut ini dari kueri sebelumnya:

  • Kata namespace kunci dalam prolog XQuery menentukan awalan yang digunakan dalam isi kueri. Untuk informasi selengkapnya, tentang prolog XQuery, lihat XQuery Prolog .

  • Ketiga langkah dalam ekspresi jalur menentukan sumbu anak dan nama simpul sebagai pengujian simpul.

  • Bagian kualifikasi langkah opsional dari langkah sumbu tidak ditentukan dalam salah satu langkah dalam ekspresi.

Kueri mengembalikan turunan <Warranty> elemen dari <Features> elemen turunan dari <ProductDescription> elemen .

Ini adalah hasilnya:

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

Dalam kueri berikut, ekspresi jalur menentukan karakter kartubebas (*) dalam pengujian simpul.

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  

Karakter kartubebas ditentukan untuk nama simpul. Dengan demikian, kueri mengembalikan semua turunan simpul elemen dari <Features> anak simpul elemen dari <ProductDescription> simpul elemen.

Kueri berikut ini mirip dengan kueri sebelumnya kecuali bahwa bersama dengan karakter kartubebas, namespace ditentukan. Akibatnya, semua anak simpul elemen di namespace tersebut dikembalikan. Perhatikan bahwa <Features> elemen dapat berisi elemen dari namespace yang berbeda.

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  

Anda bisa menggunakan karakter kartubebas sebagai awalan namespace, seperti yang diperlihatkan dalam kueri ini:

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  

Kueri ini mengembalikan turunan <Maintenance> simpul elemen di semua namespace layanan dari dokumen XML katalog produk.

C. Menentukan jenis node dalam pengujian simpul

Contoh berikut menentukan jenis node sebagai pengujian simpul di semua ekspresi jalur. Akibatnya, semua ekspresi mengembalikan simpul dari jenis yang ditentukan dalam pengujian simpul.

Dalam kueri berikut, ekspresi jalur menentukan jenis node di langkah ketiganya:

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  

Dalam kueri berikutnya, berikut ini ditentukan:

  • Ekspresi jalur memiliki tiga langkah yang dipisahkan oleh tanda garis miring (/).

  • Masing-masing langkah ini menentukan sumbu anak.

  • Dua langkah pertama menentukan nama node sebagai pengujian simpul, dan langkah ketiga menentukan jenis node sebagai pengujian simpul.

  • Ekspresi mengembalikan turunan simpul teks dari turunan <Features> elemen dari <ProductDescription> simpul elemen.

Hanya satu simpul teks yang dikembalikan. Ini adalah hasilnya:

These are the product highlights.   

Kueri berikut mengembalikan turunan simpul komentar dari <ProductDescription> elemen:

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  

Perhatikan hal berikut ini dari kueri sebelumnya:

  • Langkah kedua menentukan jenis node sebagai pengujian simpul.

  • Akibatnya, ekspresi mengembalikan anak simpul komentar dari simpul <ProductDescription> elemen.

Ini adalah hasilnya:

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

Kueri berikut mengambil node instruksi pemrosesan tingkat atas:

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  

Ini adalah hasilnya:

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

Anda dapat meneruskan parameter harfiah string ke pengujian simpul processing-instruction() . Dalam hal ini, kueri mengembalikan instruksi pemrosesan yang nilai atribut namanya adalah string harfiah yang ditentukan dalam argumen.

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  

Batasan Implementasi

Berikut ini adalah batasan spesifik

  • Pengujian node SequenceType yang diperluas tidak didukung.

  • processing-instruction(name) tidak didukung. Sebagai gantinya, masukkan nama dalam tanda kutip.