Поделиться через


Функция namespace-uri (XQuery)

Возвращает URI-код пространства имен для QName, указанного в аргументе $arg как xs:string.

Синтаксис

fn:namespace-uri() as xs:string
fn:namespace-uri($arg as node()?) as xs:string

Аргументы

  • $arg
    Имя узла, для которого будет получена часть URI-кода пространства имен.

Примечания

  • Если аргумент опускается, значением по умолчанию является узел контекста.

  • В SQL Server функция fn:namespace-uri() без аргумента может использоваться только в контексте или зависимом от контекста предикате. Точнее, она может использоваться только внутри квадратных скобок ([ ]).

  • Если аргумент $arg является пустой последовательностью, возвращается строка нулевой длины.

  • Если аргумент $arg является элементом или узлом атрибута, чье расширенное имя QName не обозначает пространство имен, функция возвращает строку нулевой длины.

Примеры

В этом разделе представлены примеры XQuery-запросов к экземплярам XML-данных, хранящимся в различных столбцах типа xml в базе данных База данных AdventureWorks2008R2. Обзор каждого из этих столбцов см. в разделе Представление типов данных XML в базе данных AdventureWorks2008R2.

А. Получение URI-кода пространства имен определенного узла

Следующий запрос обращается к нетипизированному экземпляру XML. В выражении запроса выражение namespace-uri(/ROOT[1]) получает часть URI-кода пространства имен указанного узла.

set @x='<ROOT><a>111</a></ROOT>'
SELECT @x.query('namespace-uri(/ROOT[1])')

Так как указанное имя QName не содержит части URI-кода пространства имен, а только часть локального имени, результатом будет строка нулевой длины.

Следующий запрос указывается в типизированном столбце xml типа Instructions. Выражение namespace-uri(/AWMI:root[1]/AWMI:Location[1]) возвращает URI-код пространства имен первого дочернего элемента <Location> элемента <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;

Результат:

https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions

Б. Использование пространства имен-uri() без аргумента в предикате

Следующий запрос указывается в типизированном столбце XML типа CatalogDescription. Выражение возвращает все узлы элементов, чей URI-код пространства имен является адресом https://www.adventure-works.com/schemas/OtherFeatures. Функция пространства имен-uri() указывается без аргумента и использует узел контекста.

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=19l

Частичный результат:

<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>

URI-код пространства имен в предыдущем запросе можно изменить на адрес https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain. Тогда будут получены все дочерние узлы элемента <ProductDescription>, чья часть URI-кода пространства имен расширенного QName является адресом https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain.

Ограничения реализации

Существуют следующие ограничения.

  • Функция namespace-uri() возвращает экземпляры типа xs:string вместо xs:anyURI.

См. также

Справочник

Основные понятия