Bagikan melalui


Ekspresi Jalur - Menentukan Sumbu

Berlaku untuk: SQL Server

Langkah sumbu dalam ekspresi jalur menyertakan komponen berikut:

Untuk informasi selengkapnya, lihat Ekspresi Jalur (XQuery).

Implementasi XQuery di SQL Server mendukung langkah-langkah sumbu berikut,

Sumbu Deskripsi
turunan Mengembalikan turunan dari simpul konteks.
keturunan Mengembalikan semua turunan dari simpul konteks.
ortu Mengembalikan induk simpul konteks.
atribut Mengembalikan atribut simpul konteks.
diri Mengembalikan simpul konteks itu sendiri.
turunan atau diri Mengembalikan simpul konteks dan semua turunan dari simpul konteks.

Semua sumbu ini, kecuali sumbu induk , adalah sumbu maju. Sumbu induk adalah sumbu terbalik, karena mencari mundur dalam hierarki dokumen. Misalnya, ekspresi child::ProductDescription/child::Summary jalur relatif memiliki dua langkah, dan setiap langkah menentukan child sumbu. Langkah pertama mengambil <turunan elemen ProductDescription> dari simpul konteks. Untuk setiap <simpul elemen ProductDescription> , langkah kedua mengambil <anak simpul elemen Ringkasan> .

Ekspresi jalur relatif, child::root/child::Location/attribute::LocationID, memiliki tiga langkah. Dua langkah pertama masing-masing menentukan child sumbu, dan langkah ketiga menentukan attribute sumbu. Saat dijalankan terhadap dokumen XML instruksi manufaktur dalam tabel Production.ProductModel , ekspresi mengembalikan LocationID atribut <anak simpul elemen Lokasi> dari <elemen akar> .

Contoh

Contoh kueri dalam topik ini ditentukan terhadap kolom jenis xml di database AdventureWorks .

J. Menentukan sumbu anak

Untuk model produk tertentu, kueri berikut mengambil <turunan simpul elemen Fitur> dari <simpul elemen ProductDescription> dari deskripsi katalog produk yang Production.ProductModel disimpan dalam tabel.

SELECT CatalogDescription.query('  
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
  /child::PD:ProductDescription/child::PD:Features')  
FROM Production.ProductModel  
WHERE ProductModelID=19  

Perhatikan hal berikut ini dari kueri sebelumnya:

  • Metode query() jenis data xml menentukan ekspresi jalur.

  • Kedua langkah dalam ekspresi jalur menentukan child sumbu dan nama node, ProductDescription dan Features, sebagai pengujian simpul. Untuk informasi tentang pengujian simpul, lihat Menentukan Pengujian Simpul dalam Langkah Ekspresi Jalur.

B. Menentukan sumbu turunan dan turunan atau diri

Contoh berikut menggunakan sumbu turunan dan turunan atau diri. Kueri dalam contoh ini ditentukan terhadap variabel jenis xml . Instans XML disederhanakan untuk dengan mudah mengilustrasikan perbedaan dalam hasil yang dihasilkan.

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

Dalam hasil berikut, ekspresi mengembalikan turunan <b> simpul elemen dari simpul <a> elemen:

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

Dalam ekspresi ini, jika Anda menentukan sumbu turunan untuk ekspresi jalur,

/child::a/child::b/descendant::*, Anda meminta semua keturunan dari <b> node elemen.

Tanda bintang (*) dalam pengujian simpul mewakili nama node sebagai pengujian simpul. Oleh karena itu, jenis node utama sumbu turunan, node elemen, menentukan jenis simpul yang dikembalikan. Artinya, ekspresi mengembalikan semua node elemen.. Simpul teks tidak dikembalikan. Untuk informasi selengkapnya tentang jenis node utama dan hubungannya dengan pengujian simpul, lihat Menentukan Pengujian Simpul dalam topik Langkah Ekspresi Jalur.

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 turunan atau diri alih-alih sumbu turunan, /child::a/child::b/descendant-or-self::* mengembalikan simpul konteks, elemen <b>, dan turunannya.

Ini adalah hasilnya:

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

Contoh kueri berikut terhadap database AdventureWorks mengambil semua simpul elemen turunan dari> <Featureselemen turunan <ProductDescription> elemen:

SELECT CatalogDescription.query('  
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
  /child::PD:ProductDescription/child::PD:Features/descendant::*  
')  
FROM  Production.ProductModel  
WHERE ProductModelID=19  

C. Menentukan sumbu induk

Kueri berikut mengembalikan <Summary> turunan elemen elemen> <ProductDescriptiondalam dokumen XML katalog produk yang Production.ProductModel disimpan dalam tabel.

Contoh ini menggunakan sumbu induk untuk kembali ke induk <>Featureelemen dan mengambilSummary<> turunan <ProductDescription> elemen elemen.

SELECT CatalogDescription.query('  
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
  
/child::PD:ProductDescription/child::PD:Features/parent::PD:ProductDescription/child::PD:Summary  
')  
FROM   Production.ProductModel  
WHERE  ProductModelID=19  
  

Dalam contoh kueri ini, ekspresi jalur menggunakan parent sumbu. Anda dapat menulis ulang ekspresi tanpa sumbu induk, seperti yang diperlihatkan dalam hal berikut:

/child::PD:ProductDescription[child::PD:Features]/child::PD:Summary  

Contoh sumbu induk yang lebih berguna disediakan dalam contoh berikut.

Setiap deskripsi katalog model produk yang disimpan di kolom CatalogDescription tabel ProductModel memiliki <ProductDescription> elemen yang memiliki ProductModelID atribut dan <Features> elemen turunan, seperti yang ditunjukkan dalam fragmen berikut:

<ProductDescription ProductModelID="..." >  
  ...  
  <Features>  
    <Feature1>...</Feature1>  
    <Feature2>...</Feature2>  
   ...  
</ProductDescription>  

Kueri menetapkan variabel iterator, $f, dalam pernyataan FLWOR untuk mengembalikan turunan <Features> elemen elemen. Untuk informasi selengkapnya, lihat Pernyataan dan Perulangan FLWOR (XQuery). Untuk setiap fitur, return klausa membuat XML dalam formulir berikut:

<Feature ProductModelID="...">...</Feature>  
<Feature ProductModelID="...">...</Feature>  

Untuk menambahkan ProductModelID untuk setiap <Feature> elemen, parent sumbu ditentukan:

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";  
  for $f in /child::PD:ProductDescription/child::PD:Features/child::*  
  return  
   <Feature  
     ProductModelID="{ ($f/parent::PD:Features/parent::PD:ProductDescription/attribute::ProductModelID)[1]}" >  
          { $f }  
   </Feature>  
')  
FROM  Production.ProductModel  
WHERE ProductModelID=19  

Ini adalah hasil parsial:

<Feature ProductModelID="19">  
  <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>  
</Feature>  
<Feature ProductModelID="19">  
  <wm:Maintenance   
   xmlns:wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">  
    <wm:NoOfYears>10 years</wm:NoOfYears>  
    <wm:Description>maintenance contract available through your dealer   
                  or any AdventureWorks retail store.</wm:Description>  
  </wm:Maintenance>  
</Feature>  
<Feature ProductModelID="19">  
  <p1:wheel   
   xmlns:p1="https://www.adventure-works.com/schemas/OtherFeatures">  
      High performance wheels.  
  </p1:wheel>  
</Feature>  

Perhatikan bahwa predikat [1] dalam ekspresi jalur ditambahkan untuk memastikan bahwa nilai singleton dikembalikan.