Definizione dell'asse in un passo dell'espressione di percorso

Ogni passe dell'asso in un'espressione di percorso include i componenti seguenti:

Per ulteriori informazioni, vedere Espressioni di percorso (XQuery).

L'implementazione di XQuery in SQL Server supporta i passi dell'asse seguenti:

Asse

Descrizione

child

Restituisce gli elementi figlio del nodo di contesto.

descendant

Restituisce tutti i discendenti del nodo di contesto.

parent

Restituisce l'elemento padre del nodo di contesto.

attribute

Restituisce gli attributi del nodo di contesto.

self

Restituisce il nodo di contesto stesso.

descendant-or-self

Restituisce il nodo di contesto e tutti i relativi discendenti.

Tutti questi assi, ad eccezione dell'asse parent, sono assi per la ricerca in avanti. L'asse parent è un asse per la ricerca a ritroso, in quanto esegue la ricerca all'indietro nella gerarchia del documento. Ad esempio, l'espressione di percorso relativo child::ProductDescription/child::Summary include due passi, ognuno dei quali specifica un asse child. Il primo passo recupera gli elementi figlio <ProductDescription> del nodo di contesto. Per ogni nodo elemento <ProductDescription>, il secondo passo recupera gli elementi figlio <Summary> corrispondenti.

L'espressione di percorso relativo child::root/child::Location/attribute::LocationID include tre passi. I primi due passi specificano ognuno un asse child, mentre il terzo passo specifica l'asse attribute. Se viene eseguita sui documenti XML delle istruzioni di produzione nella tabella Production.ProductModel, l'espressione restituisce l'attributo LocationID del nodo elemento figlio <Location> dell'elemento <root>.

Esempi

Gli esempi di query indicati in questo argomento vengono eseguiti sulle colonne di tipo xml del database AdventureWorks2008R2. Per informazioni su tali colonne, vedere Rappresentazione del tipo di dati XML nel database AdventureWorks2008R2.

A. Definizione di un asse child

Per il modello di un prodotto specifico, la query seguente recupera gli elementi figlio <Features> del nodo elemento <ProductDescription> dalla descrizione del catalogo prodotti archiviata nella tabella Production.ProductModel.

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

Dalla query precedente si noti quanto segue:

B. Definizione di assi descendant e descendant-or-self

Nell'esempio seguente vengono utilizzati assi descendant e descendant-or-self. La query illustrata nell'esempio viene eseguita su una variabile di tipo xml. L'istanza XML è semplificata per illustrare in modo chiaro la differenza nei risultati generati.

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

Nel risultato seguente, l'espressione restituisce il nodo elemento figlio <b> del nodo elemento <a>:

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

Se in questa espressione si specifica un asse descendant per l'espressione di percorso,

/child::a/child::b/descendant::*, si richiedono tutti i discendenti del nodo elemento <b>.

L'asterisco (*) nel test di nodo rappresenta il nome del nodo come test di nodo. Pertanto, il tipo di nodo primario dell'asse descendant, il nodo elemento, determina i tipi di nodi restituiti. L'espressione restituisce quindi tutti i nodi elemento. I nodi di testo non vengono restituiti. Per ulteriori informazioni sul tipo di nodo primario e sulle relative relazioni con il test di nodo, vedere l'argomento Definizione del test di nodo in un passo dell'espressione di percorso.

I nodi elemento <c> e <d> vengono restituiti, come illustrato nel risultato seguente:

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

Se si specifica un asse descendant-or-self anziché l'asse descendant, /child::a/child::b/descendant-or-self::* restituisce il nodo di contesto, l'elemento <b> e i relativi discendenti.

Risultato:

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

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

<d>text3</d> 

La query di esempio seguente sul database AdventureWorks2008R2 recupera tutti i nodi elemento discendenti dell'elemento figlio <Features> dell'elemento <ProductDescription>:

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. Definizione di un asse parent

La query seguente restituisce l'elemento figlio <Summary> dell'elemento <ProductDescription> nel documento XML del catalogo prodotti archiviato nella tabella Production.ProductModel.

In questo esempio viene utilizzato l'asse parent per tornare all'elemento padre dell'elemento <Feature> e recuperare l'elemento figlio <Summary> dell'elemento <ProductDescription>.

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 
 

In questo esempio di query, l'espressione di percorso utilizza l'asse parent. È possibile riscrivere l'espressione senza l'asse parent, come illustrato di seguito:

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

Un esempio più dettagliato dell'asse parent è il seguente.

Ogni descrizione del catalogo prodotti archiviata nella colonna CatalogDescription della tabella ProductModel include un elemento <ProductDescription> con l'attributo ProductModelID e l'elemento figlio <Features>, come illustrato nel frammento seguente:

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

La query imposta la variabile iteratore $f nell'istruzione FLWOR per restituire gli elementi figli dell'elemento <Features>. Per ulteriori informazioni, vedere Istruzione e iterazione FLWOR (XQuery). Per ogni caratteristica, la clausola return costruisce un'istanza XML nel formato seguente:

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

Per aggiungere ProductModelID per ogni elemento <Feature>, viene specificato l'asse parent:

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

Risultato parziale:

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

Si noti che il predicato [1] nell'espressione di percorso viene aggiunto per assicurare che venga restituito un valore singleton.