Définition d'une étape d'axe dans une expression de chemin d'accès
Une étape d'axe dans une expression de chemin d'accès se compose des éléments suivants :
Pour plus d'informations, consultez Expressions de chemin d'accès (XQuery).
L'implémentation de XQuery dans SQL Server prend en charge les étapes d'axe suivantes :
Axe |
Description |
---|---|
child |
Retourne l'enfant du nœud du contexte. |
descendant |
Retourne tous les descendants du nœud du contexte. |
parent |
Retourne le parent du nœud du contexte. |
attribute |
Retourne les attributs du nœud du contexte. |
self |
Retourne le nœud du contexte lui-même. |
descendant-or-self |
Retourne le nœud du contexte et tous ses descendants. |
Tous ces axes, excepté l'axe parent, sont des axes pour la recherche vers l'avant. L'axe parent est un axe pour la recherche vers l'arrière, car il remonte dans la hiérarchie de documents pour effectuer les recherches. Par exemple, l'expression de chemin d'accès relative child::ProductDescription/child::Summary comprend deux étapes, chacune spécifiant un axe child. La première étape extrait l'enfant d'élément <ProductDescription> du nœud du contexte. Pour chaque nœud d'élément <ProductDescription>, la seconde étape extrait son enfant <Summary>.
L'expression de chemin d'accès relative child::root/child::Location/attribute::LocationID comporte quant à elle trois étapes. Les deux premières définissent un axe child, et la troisième, un axe attribute. Lorsque l'expression est exécutée sur les documents XML des instructions de fabrication de la table Production.ProductModel, elle retourne l'attribut LocationID de l'enfant du nœud <Location> de l'élément <root>.
Exemples
Les exemples de requête de cette rubrique sont définis sur des colonnes de type xml de la base de données AdventureWorks. Pour plus d'informations sur ces colonnes, consultez Représentation du type de données xml dans la base de données AdventureWorks.
A. Spécification de l'axe enfant
Pour un modèle de produit spécifique, la requête ci-dessous extrait l'enfant <Features> du nœud d'élément <ProductDescription> de la description de catalogue de produits stockée dans la table 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
Observez ce qui suit dans la requête précédente :
La méthode query() de type de données xml spécifie l'expression de chemin d'accès.
Les deux étapes de cette expression définissent un axe child et les noms des nœuds, ProductDescription et Features en tant que tests de nœuds. Pour plus d'informations sur les tests de nœuds, consultez Spécification d'un test de nœud dans une étape d'expression du chemin d'accès.
B. Définition des axes descendant et descendant-or-self
L'exemple ci-dessous utilise des axes descendant et descendant-or-self. Sa requête est spécifiée sur une variable de type xml. L'instance XML est simplifiée pour illustrer facilement la différence dans les résultats générés.
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
Dans le résultat suivant, l'expression retourne l'enfant <b> du nœud d'élément <a> :
<b>text1
<c>text2
<d>text3</d>
</c>
</b>
Dans cette expression, si vous spécifiez un axe descendant pour l'expression de chemin d'accès,
/child::a/child::b/descendant::*, vous demandez tous les descendants du nœud d'élément <b>.
L'astérisque (*) dans le test de nœud représente le nom du nœud comme un test de nœud. Par conséquent, le type de nœud principal de l'axe descendant, le nœud d'élément, détermine les types de nœuds retournés. En d'autres termes, l'expression retourne tous les nœuds d'élément. Les nœuds de texte sont retournés. Pour plus d'informations sur le type de nœud principal et sur sa relation avec le test de nœud, consultez Spécification d'un test de nœud dans une étape d'expression du chemin d'accès.
Les nœuds d'élément <c> et <d> sont retournés, comme le montre le résultat suivant :
<c>text2
<d>text3</d>
</c>
<d>text3</d>
Si vous spécifiez un axe descendant-or-self au lieu d'un axe descendant, /child::a/child::b/descendant-or-self::* retourne le nœud du contexte, l'élément <b> et son descendant.
Voici le jeu de résultats obtenu :
<b>text1
<c>text2
<d>text3</d>
</c>
</b>
<c>text2
<d>text3</d>
</c>
<d>text3</d>
L'exemple de requête ci-dessous exécuté sur la base de données AdventureWorks extrait tous les nœuds d'éléments descendants de l'enfant <Features> de l'élément <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
A. Spécification de l'axe parent
La requête ci-après retourne l'enfant Summary> de l'élément <ProductDescription> du document XML du catalogue de produits stocké dans la table Production.ProductModel.
Elle utilise l'axe parent pour renvoyer le parent de l'élément <Feature> et extrait l'enfant <Summary> de l'élément <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
Dans cette requête, l'expression de chemin d'accès utilise l'axe parent. Vous pouvez la réécrire sans l'axe parent, comme ceci :
/child::PD:ProductDescription[child::PD:Features]/child::PD:Summary
L'exemple ci-dessous illustre un emploi plus utile de l'axe parent.
Chaque description du catalogue de produits stockée dans la colonne CatalogDescription de la table ProductModel comporte un élément <ProductDescription> comprenant l'attribut ProductModelID et l'élément enfant <Features>, comme le montre le fragment de code ci-dessous :
<ProductDescription ProductModelID="..." >
...
<Features>
<Feature1>...</Feature1>
<Feature2>...</Feature2>
...
</ProductDescription>
La requête définit une variable itérateur, $f, dans l'instruction FLWOR afin de retourner l'enfant de l'élément <Features>. Pour plus d'informations, consultez Instruction et itération FLWOR (XQuery). Pour chaque fonctionnalité, la clause return construit du code XML au format suivant :
<Feature ProductModelID="...">...</Feature>
<Feature ProductModelID="...">...</Feature>
Pour ajouter l'ID ProductModelID pour chaque élément <Feature>, l'axe parent est spécifié :
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
Voici le résultat partiel :
<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>
Notez que le prédicat [1] dans l'expression de chemin d'accès est ajouté pour garantir qu'une valeur singleton est retournée.