Fonction namespace-uri (XQuery)
Renvoie l'URI d'espace de noms du QName spécifié dans $arg sous la forme d'un type xs:string.
Syntaxe
fn:namespace-uri() as xs:string
fn:namespace-uri($arg as node()?) as xs:string
Arguments
- $arg
Nom de nœud dont la partie URI d'espace de noms doit être extraite.
Remarques
Si l'argument est omis, la valeur par défaut est le nœud de contexte.
Dans SQL Server, la fonction fn:namespace-uri() ne peut être utilisée sans argument que dans le contexte d'un prédicat dépendant du contexte. En particulier, elle ne peut être utilisée qu'entre crochets ([ ]).
Si $arg est la séquence vide, la chaîne nulle est renvoyée.
Si $arg est un nœud d'élément ou d'attribut dont le QName étendu n'appartient pas à un espace de noms, la fonction renvoie la chaîne nulle.
Exemples
Cette rubrique fournit des exemples de requêtes XQuery impliquant des instances XML stockées dans différentes colonnes de type xml dans la base de données AdventureWorks. Pour une vue d'ensemble de chacune de ces colonnes, consultez Représentation du type de données xml dans la base de données AdventureWorks.
A. Extraction de l'URI d'espace de noms d'un nœud spécifique
La requête suivante est spécifiée par rapport à une instance XML non typée. L'expression de requête, namespace-uri(/ROOT[1]), extrait la partie URI d'espace de noms du nœud spécifié.
set @x='<ROOT><a>111</a></ROOT>'
SELECT @x.query('namespace-uri(/ROOT[1])')
Étant donné que le QName spécifié ne possède pas la partie URI d'espace de noms mais uniquement la partie nom local, le résultat est une chaîne nulle.
La requête suivante porte sur la colonne xml typée Instructions. L'expression, namespace-uri(/AWMI:root[1]/AWMI:Location[1]), renvoie l'URI d'espace de noms du premier élément enfant <Location> de l'élément <root>.
SELECT Instructions.query('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions" ;
namespace-uri(/AWMI:root[1]/AWMI:Location[1])') as Result
FROM Production.ProductModel
WHERE ProductModelID=7
Voici le résultat obtenu :
https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions
B. Utilisation de namespace-uri() sans argument dans un prédicat
La requête suivante porte sur la colonne xml typée CatalogDescription. L'expression renvoie tous les nœuds d'élément dont l'URI d'espace de noms est https://www.adventure-works.com/schemas/OtherFeatures. La fonction namespace-uri() est spécifiée sans argument et utilise le nœud de contexte.
SELECT CatalogDescription.query('
declare namespace p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
/p1:ProductDescription//*[namespace-uri() = "https://www.adventure-works.com/schemas/OtherFeatures"]
') as Result
FROM Production.ProductModel
WHERE ProductModelID=19
Voici le résultat partiel :
<p1:wheel xmlns:p1="https://www.adventure-works.com/schemas/OtherFeatures">High performance wheels.</p1:wheel>
<p2:saddle xmlns:p2="https://www.adventure-works.com/schemas/OtherFeatures">
<p3:i xmlns:p3="http://www.w3.org/1999/xhtml">Anatomic design</p3:i> and made from durable leather for a full-day of riding in comfort.</p2:saddle>
…
Vous pouvez remplacer l'URI d'espace de noms dans la requête précédente par https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain. Vous obtenez alors tous les enfants du nœud de l'élément <ProductDescription> dont la partie URI d'espace de noms du QName étendu est https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain.
Limites de la mise en œuvre
Les limites sont les suivantes :
- La fonction namespace-uri() renvoie des instances de type xs:string au lieu d'instances de type xs:anyURI.