构造元素的名称空间作用域
构造元素节点的名称空间作用域属性由一组名称空间绑定组成。 每个名称空间绑定使名称空间前缀与 URI 相关联。 名称空间绑定会定义一组名称空间前缀,以用于在元素作用域中解释 QName。
重要信息: 要了解本主题,您需要了解以下概念之间的差异:
构造元素的名称空间作用域包括使用下列方式创建的所有名称空间绑定:- 静态已知名称空间
- 静态已知名称空间是表达式属性。 此属性指示在处理表达式期间,XQuery 用于解析名称空间前缀的一组名称空间绑定。 这些绑定未包括在查询结果中。
- 名称空间作用域
- 名称空间作用域是元素节点属性。 此属性指示在处理元素及其内容时,可供 XQuery 外部的应用程序使用的一组名称空间绑定。 这些绑定以序列化方式出现在查询结果中,所以它们可供外部应用程序使用。
- 通过名称空间声明属性显式进行。 将为下列构造函数中声明的每个名称空间声明属性创建一个名称空间绑定。
- 当前元素构造函数。
- 封闭直接元素构造函数(除非名称空间声明属性被当前元素构造函数或中间构造函数覆盖)。
- 由系统自动执行。 将在以下情况下创建名称空间绑定:
- 将前缀
xml绑定到名称空间 URIhttp://www.w3.org/XML/1998/namespace。 将为每个构造元素创建此绑定。 - 对于构造元素名称或其属性名称中使用的每个元素(除非元素的名称空间作用域中已存在名称空间绑定)。 如果节点的名称包含前缀,那么会在名称空间绑定中使用该前缀。 如果该名称没有前缀,那么会为空前缀创建绑定。 如果发生冲突(需要使用同一前缀的两个不同绑定),那么节点名中使用的前缀将更改为任意前缀,并且为该任意前缀创建名称空间绑定。请记住: QName 中使用的前缀必须解析为有效 URI ,否则无法将该前缀的绑定添加到元素的作用域名称空间中。 如果不能解析 QName,那么表达式会产生错误。
- 将前缀
示例
以下查询包含序言和主体,序言包含名称空间声明,而主体包含直接元素构造函数:
注意,名称空间
declare namespace p="http://example.com/ns/p";
declare namespace q="http://example.com/ns/q";
declare namespace f="http://example.com/ns/f";
<p:newElement q:b="{f:func(2)}" xmlns:r="http://example.com/ns/r"/>序言中的名称空间声明会将名称空间绑定添加至表达式的静态已知名称空间。 但是,仅当构造函数中的 QName 使用这些名称空间时,才会将名称空间绑定添加至构造元素的名称空间作用域。 因此,p:newElement
的名称空间作用域包含下列名称空间绑定:p = "http://example.com/ns/p"- 此名称空间绑定将添加至名称空间作用域,原因是前缀p出现在 QNamep:newElement中。q = "http://example.com/ns/q"- 此名称空间绑定将添加至名称空间作用域,原因是前缀q出现在属性 QNameq:b中。r = "http://example.com/ns/r"- 此名称空间绑定将添加至名称空间作用域,原因是它是由名称空间声明属性定义的。xml = "http://www.w3.org/XML/1998/namespace"-此名称空间绑定将添加到作用域内名称空间,因为它是为每个构造的元素节点定义的。
f="http://example.com/ns/f" 的任何绑定不会添加至名称空间作用域。 这是因为元素构造函数未包含使用前缀
f 的元素或属性名,即使 f:func(2)
出现在属性 q:b 的内容中也是如此。 因此,此名称空间绑定不会出现在查询结果中,即使它出现在静态已知名称空间中并且可在处理查询期间使用也是如此。