Espressioni di percorso - Specifica asse

Si applica a:SQL Server

Ogni passo dell'asse in un'espressione di percorso include i componenti seguenti:

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

L'implementazione di XQuery in SQL Server supporta i passaggi 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 padre , sono assi in avanti. L'asse padre è un asse inverso, perché esegue ricerche all'indietro nella gerarchia dei documenti. Ad esempio, l'espressione di percorso relativo child::ProductDescription/child::Summary include due passi, ognuno dei quali specifica un asse child. Il primo passaggio recupera gli elementi figlio dell'elemento <ProductDescription> del nodo di contesto. Per ogni <nodo elemento ProductDescription> , il secondo passaggio recupera gli elementi figlio dell'elemento <Summary> .

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. Quando eseguito sui documenti XML delle istruzioni di produzione nella tabella Production.ProductModel , l'espressione restituisce l'attributo LocationID del nodo elemento <Location> figlio dell'elemento <radice> .

Esempi

Gli esempi di query in questo argomento vengono specificati in base alle colonne di tipo xml nel database AdventureWorks .

R. Definizione di un asse child

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

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:

  • Il query() metodo del tipo di dati xml specifica l'espressione di percorso.

  • Entrambi i passi dell'espressione di percorso specificano un asse child e i nomi dei nodi, ProductDescription e Features, come test di nodo. Per informazioni sui test dei nodi, vedere Specifica del test del nodo in un passaggio di espressione di percorso.

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

Nell'esempio seguente vengono utilizzati assi descendant e descendant-or-self. La query in questo esempio viene specificata in base a 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::*, viene chiesto tutti i discendenti del nodo dell'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 altre informazioni sul tipo di nodo primario e sulla relativa relazione con il test del nodo, vedere l'argomento Specifica del test del nodo in un passaggio dell'espressione di percorso.

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

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

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

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 AdventureWorks recupera tutti i nodi elemento discendente dell'elemento <Features> figlio 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 dell'elemento <ProductDescription> nel documento XML del catalogo prodotti archiviato nella Production.ProductModel tabella.<Summary>

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

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 del modello di prodotto archiviata nella colonna CatalogDescription della tabella ProductModel include un <ProductDescription> elemento con l'attributo e <Features> l'elemento ProductModelID figlio, 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 altre informazioni, vedere Istruzione FLWOR e iterazione (XQuery). Per ogni caratteristica, la clausola return costruisce un'istanza XML nel formato seguente:

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

Per aggiungere l'oggetto ProductModelID per ogni <Feature> elemento, 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 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>  

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