expanded-QName (XQuery)

返回在 $paramURI 中指定的具有命名空间 URI 的 xs:QName 类型的值以及在 $paramLocal 中指定的本地名称。如果 $paramURI 为空字符串或空序列,则它表示无命名空间。

语法

fn:expanded-QName($paramURI as xs:string?, $paramLocal as xs:string?) as xs:QName?

参数

  • $paramURI
    QName 的命名空间 URI。

  • $paramLocal
    QName 的本地名称部分。

备注

以下适用于 expanded-QName() 函数:

  • 如果指定的 $paramLocal 值不是 xs:NCName 类型的正确词汇格式,则返回空序列表示动态错误。

  • 在 SQL Server 中不支持从 xs:QName 类型转换为任何其他类型。因此,expanded-QName() 函数无法用于 XML 构造。例如,当构造节点(如 <e> expanded-QName(…) </e>)时,其值就必须是非类型化的。这就要求您将 expanded-QName() 返回的 xs:QName 类型值转换为 xdt:untypedAtomic。但是,不支持此操作。在本主题的后面的示例中给出了一种解决方案。

  • 您可以修改或比较现有的 QName 类型值。例如,/root[1]/e[1] eq expanded-QName("http://nsURI" "myNS") 将元素(即 <e>)的值与 expanded-QName() 函数返回的 QName 相比较。

示例

本主题提供了一些对 XML 实例的 XQuery 示例,这些实例存储在 AdventureWorks2008R2 数据库内不同的 xml 类型列中。有关这些列的概述,请参阅 AdventureWorks2008R2 数据库中的 xml 数据类型表示形式

A. 替换 QName 类型节点值

此示例说明了如何修改 QName 类型的元素节点的值。该示例执行以下操作:

  • 创建定义 QName 类型的元素的 XML 架构集合。

  • 使用 XML 架构集合创建含有 xml 类型列的表。

  • 将 XML 实例保存在表中。

  • 使用 xml 数据类型的 modify() 方法来修改该实例中的 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> 

在以下查询中,通过使用 xml 数据类型的 modify() 方法和 XML DML 的替换值来替换 <ElemQN> 元素值,如下所示。

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

结果如下。请注意,QName 类型的元素 <ElemQN> 现在有了一个新的值:

<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

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="http://someURI">a:b</root>')
 go
-- Verify
SELECT * 
FROM T

以下示例尝试添加其他 <root> 元素,但未成功,因为 XML 构造不支持 expanded-QName() 函数。

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> 元素,这些元素的值与 expanded-QName() 函数返回的 QName 类型值相匹配。

SELECT xmlCol.query('
    for $i in /root
    return
       if ($i eq expanded-QName("http://ns","someLocalName") ) then
          $i
       else
          ()')
FROM T

实现限制

有一个限制:expanded-QName() 函数第二个参数支持空序列,并将在第二个参数错误时返回空,而不出现运行时错误。