Funciones usadas en nodos: namespace-uri
Se aplica a:SQL Server
Devuelve el URI del espacio de nombres del QName especificado en $arg como xs:string.
Sintaxis
fn:namespace-uri() as xs:string
fn:namespace-uri($arg as node()?) as xs:string
Argumentos
$arg
Nombre del nodo cuya parte del URI del espacio de nombres se va a recuperar.
Comentarios
Si se omite este argumento, el valor predeterminado es el nodo del contexto.
En SQL Server, fn:namespace-uri() sin un argumento solo se puede usar en el contexto de un predicado dependiente del contexto. En concreto, solo se puede utilizar entre corchetes ([ ]).
Si $arg es la secuencia vacía, se devuelve la cadena de longitud cero.
Si $arg es un nodo de elemento o atributo cuyo nombre expandido-QName no está en un espacio de nombres, la función devuelve la cadena de longitud cero.
Ejemplos
En este tema se proporcionan ejemplos de XQuery en las instancias XML almacenadas en varias columnas de tipo xml de la base de datos AdventureWorks.
A. Recuperar el URI de espacio de nombres de un nodo específico
La consulta siguiente se especifica en una instancia XML sin tipo. La expresión de la consulta, namespace-uri(/ROOT[1])
, recupera la parte del URI del espacio de nombres del nodo especificado.
set @x='<ROOT><a>111</a></ROOT>'
SELECT @x.query('namespace-uri(/ROOT[1])')
Dado que el QName especificado no tiene la parte del URI del espacio de nombres sino únicamente la parte del nombre local, el resultado es una cadena de longitud cero.
La consulta siguiente se especifica en la columna xml instrucciones con tipo . La expresión, namespace-uri(/AWMI:root[1]/AWMI:Location[1])
, devuelve el URI del espacio de nombres del primer <Location
> elemento secundario del <root
> elemento.
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
El resultado es el siguiente:
https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions
B. Usar namespace-uri() sin argumento en un predicado
La siguiente consulta se especifica para la columna xml con tipo CatalogDescription. La expresión devuelve todos los nodos de elementos cuyo URI del espacio de nombres es https://www.adventure-works.com/schemas/OtherFeatures
. La función namespace-uri() se especifica sin un argumento y usa el nodo de contexto.
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
Este es el resultado parcial:
<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>
...
Puede cambiar el URI del espacio de nombres de la consulta anterior por https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain
. A continuación, recibirá todos los elementos secundarios del nodo de elemento del <ProductDescription
> elemento cuyo URI de espacio de nombres de la QName expandida es .https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain
Limitaciones de la implementación
Éstas son las limitaciones:
- La función namespace-uri() devuelve instancias de tipo xs:string en lugar de xs:anyURI.