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


expanded-QName (XQuery)

Возвращает значение типа 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 type к любому другому типу не поддерживается в приложении SQL Server 2005. Поэтому функция expanded-QName() не может быть использована в XML-конструкции. Например при создании узла, такого как <e> expanded-QName(...) </e>, значение должно быть нетипизированным. Это потребовало бы преобразования значения типа xs:QName, возвращаемого функцией expanded-QName() к типу xdt:untypedAtomic. Однако это не поддерживается. Решение приведено далее в примере в этом же подразделе.
  • Можно модифицировать или сравнить существующие значения типа QName. Например /root[1]/e[1] eq expanded-QName("http://nsURI" "myNS") сравнивает значение элемента, <e> с QName, возвращаемым функцией expanded-QName().

Примеры

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

А. Замещение значения узла типа 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="http://myURI">
      <ElemQN>ns:someName</ElemQN>
</Root>')
go
-- Verify the insertion
SELECT * from T
go
-- Result
<Root xmlns="QNameXSD" xmlns:ns="http://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("http://myURI", "myLocalName") ')
go
-- Verify the result
SELECT * from T
go

Результат. Теперь элемент <ElemQN> типа QName имеет другое значение:

<Root xmlns="QNameXSD" xmlns:ns="urn">
  <ElemQN xmlns:p1="http://myURI">p1:myLocalName</ElemQN>
</Root>

Следующие инструкции удаляют объекты, используемые в примере.

-- Cleanup
DROP TABLE T
go
drop xml schema collection SC
go

Б. Работа с ограничениями при использовании функции expanded-QName()

В приложении SQL Server 2005 функцию 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="http://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> и его последующая модификация. В этом примере используется начальное значение нуль при добавлении элемента <root>. Коллекция XML-схем в этом примере разрешает значение нуль для элемента <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="http://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() принимает пустую последовательность в качестве второго аргумента; если второй аргумент недопустимый, возвращает пустое значение, а не формирует ошибку периода исполнения.

См. также

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

Функции, относящиеся к QName (XQuery)

Справка и поддержка

Получение помощи по SQL Server 2005