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


Функции, связанные с 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() принимает пустую последовательность в качестве второго аргумента и возвращает пустую, а не вызывает ошибку во время выполнения, если второй аргумент является неправильным.

См. также

Функции, связанные с QNames (XQuery)