Espressioni di percorso - Specifica asse
Si applica a:SQL Server
Ogni passo dell'asse in un'espressione di percorso include i componenti seguenti:
Un asse
Test di un nodo
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
eFeatures
, 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.