Функции, связанные с QName — expanded-QName
Область применения: SQL Server
Возвращает значение типа xs:QName с URI пространства имен, указанным в $paramURI , и локальное имя, указанное в $paramLocal. Если $paramURI является пустой строкой или пустой последовательностью, она не представляет пространства имен.
Синтаксис
fn:expanded-QName($paramURI as xs:string?, $paramLocal as xs:string?) as xs:QName?
Аргументы
$paramURI
URI-код пространства имен для QName.
$paramLocal
Часть локального имени QName.
Замечания
Ниже приведена функция expanded-QName( ):
Если указанное $paramLocal значение не находится в правильной лексической форме для типа xs:NCName, возвращается пустая последовательность и представляет динамическую ошибку.
Преобразование типа xs:QName в любой другой тип не поддерживается в SQL Server. Из-за этого функция expanded-QName() не может использоваться в построении XML. Например при создании узла, такого как
<e> expanded-QName(...) </e>
, значение должно быть нетипизированным. Это потребовало бы преобразования значения типа xs:QName, возвращаемого функциейexpanded-QName()
к типу xdt:untypedAtomic. Однако это не поддерживается. Решение приведено далее в примере в этом же подразделе.Можно модифицировать или сравнить существующие значения типа QName. Например,
/root[1]/e[1] eq expanded-QName("http://nsURI" "myNS")
сравнивает значение элемента с именем QName, <e
>возвращаемым функцией expanded-QName().
Примеры
В этом разделе приведены примеры XQuery для экземпляров XML, хранящихся в различных столбцах типа XML в AdventureWorks2022
базе данных.
А. Замещение значения узла типа QName
Данный пример иллюстрирует изменение значения узла элемента типа QName. В примере выполняются следующие действия.
Создается коллекция XML-схем, которая определяет элемент типа QName.
Создает таблицу с столбцом типа XML с помощью коллекции схем XML.
Экземпляр XML сохраняется в таблице.
Использует метод modify() типа данных XML для изменения значения элемента типа QName в экземпляре. Функция expanded-QName() используется для создания нового значения типа QName.
-- If XML schema collection (if exists)
-- drop xml schema collection SC
-- go
-- Create XML schema collection
CREATE XML SCHEMA COLLECTION SC AS N'
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="QNameXSD"
xmlns:xqo="QNameXSD" elementFormDefault="qualified">
<element name="Root" type="xqo:rootType" />
<complexType name="rootType">
<sequence minOccurs="1" maxOccurs="1">
<element name="ElemQN" type="xs:QName" />
</sequence>
</complexType>
</schema>'
go
-- Create table.
CREATE TABLE T( XmlCol xml(SC) )
-- Insert sample XML instnace
INSERT INTO T VALUES ('
<Root xmlns="QNameXSD" xmlns:ns="https://myURI">
<ElemQN>ns:someName</ElemQN>
</Root>')
go
-- Verify the insertion
SELECT * from T
go
-- Result
<Root xmlns="QNameXSD" xmlns:ns="https://myURI">
<ElemQN>ns:someName</ElemQN>
</Root>
В следующем запросе <ElemQN
> значение элемента заменяется с помощью метода modify() типа данных XML и значения замены XML DML, как показано ниже.
-- the value.
UPDATE T
SET XmlCol.modify('
declare default element namespace "QNameXSD";
replace value of /Root[1]/ElemQN
with expanded-QName("https://myURI", "myLocalName") ')
go
-- Verify the result
SELECT * from T
go
Результат. Обратите внимание, что элемент <ElemQN
> типа QName теперь имеет новое значение:
<Root xmlns="QNameXSD" xmlns:ns="urn">
<ElemQN xmlns:p1="https://myURI">p1:myLocalName</ElemQN>
</Root>
Следующие инструкции удаляют объекты, используемые в примере.
-- Cleanup
DROP TABLE T
go
drop xml schema collection SC
go
B. Работа с ограничениями при использовании функции expanded-QName()
Функция expanded-QName не может использоваться в построении XML. Это показано в следующем примере. Чтобы обойти это ограничение пример сначала вставляет узел, затем изменяет его.
-- if exists drop the table T
--drop table T
-- go
-- Create XML schema collection
-- DROP XML SCHEMA COLLECTION SC
-- go
CREATE XML SCHEMA COLLECTION SC AS '
<schema xmlns="http://www.w3.org/2001/XMLSchema">
<element name="root" type="QName" nillable="true"/>
</schema>'
go
-- Create table T with a typed xml column (using the XML schema collection)
CREATE TABLE T (xmlCol XML(SC))
go
-- Insert an XML instance.
insert into T values ('<root xmlns:a="https://someURI">a:b</root>')
go
-- Verify
SELECT *
FROM T
Следующая попытка добавляет еще один <root
> элемент, но завершается сбоем, так как функция expanded-QName() не поддерживается в построении XML.
update T SET xmlCol.modify('
insert <root>{expanded-QName("http://ns","someLocalName")}</root> as last into / ')
go
Решением для этого является сначала вставка экземпляра со значением для <root
> элемента, а затем его изменение. В этом примере начальное значение nil используется при <root
> вставке элемента. Коллекция схем XML в этом примере позволяет использовать значение nil для <root
> элемента.
update T SET xmlCol.modify('
insert <root xsi:nil="true"/> as last into / ')
go
-- now replace the nil value with another QName.
update T SET xmlCol.modify('
replace value of /root[last()] with expanded-QName("http://ns","someLocalName") ')
go
-- verify
SELECT * FROM T
go
-- result
<root>b</root>
<root xmlns:a="https://someURI">a:b</root>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p1="http://ns">p1:someLocalName</root>
Можно сравнить значение QName, как показано в следующем запросе. Запрос возвращает только <root
> элементы, значения которых соответствуют значению типа QName, возвращаемого функцией expanded-QName().
SELECT xmlCol.query('
for $i in /root
return
if ($i eq expanded-QName("http://ns","someLocalName") ) then
$i
else
()')
FROM T
Ограничения реализации
Существует одно ограничение: функция expanded-QName() принимает пустую последовательность в качестве второго аргумента и возвращает пустую, а не вызывает ошибку во время выполнения, если второй аргумент является неправильным.