使用 targetNamespace 属性指定目标命名空间(SQLXML 4.0)
在编写 XSD 架构时,可以使用 XSD targetNamespace
属性指定目标命名空间。 本文介绍 XSD targetNamespace
elementFormDefault
和attributeFormDefault
属性的工作原理、它们如何影响生成的 XML 实例,以及如何使用命名空间指定 XPath 查询。
可以使用该特性将 xsd:targetNamespace
默认命名空间中的元素和属性放入其他命名空间。 还可以指定在显示局部声明的架构元素和属性时,是否应由命名空间限定(使用前缀显式限定或默认隐式限定)。 可以使用elementFormDefault
元素上的<xsd:schema>
和attributeFormDefault
属性全局指定局部元素和属性的限定,也可以使用form
该属性单独指定各个元素和属性。
示例
若要创建使用以下示例的工作示例,必须满足某些要求。 有关详细信息,请参阅 运行 SQLXML 示例的要求。
A. 指定目标命名空间
以下 XSD 架构使用 xsd:targetNamespace
特性指定目标命名空间。 架构还会将 elementFormDefault
和 attributeFormDefault
属性值设置为 "unqualified"
(这些属性的默认值)。 这是一个全局声明,影响所有本地元素(<Order>
架构)和属性(CustomerID
以及ContactName
OrderID
架构中)。
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema"
xmlns:CO="urn:MyNamespace"
targetNamespace="urn:MyNamespace">
<xsd:annotation>
<xsd:appinfo>
<sql:relationship name="CustOrders"
parent="Sales.Customer"
parent-key="CustomerID"
child="Sales.SalesOrderHeader"
child-key="CustomerID" />
</xsd:appinfo>
</xsd:annotation>
<xsd:element name="Customer"
sql:relation="Sales.Customer"
type="CO:CustomerType" />
<xsd:complexType name="CustomerType">
<xsd:sequence>
<xsd:element name="Order"
sql:relation="Sales.SalesOrderHeader"
sql:relationship="CustOrders"
type="CO:OrderType" />
</xsd:sequence>
<xsd:attribute name="CustomerID" type="xsd:string" />
<xsd:attribute name="SalesPersonID" type="xsd:string" />
</xsd:complexType>
<xsd:complexType name="OrderType">
<xsd:attribute name="SalesOrderID" type="xsd:integer" />
<xsd:attribute name="CustomerID" type="xsd:string" />
</xsd:complexType>
</xsd:schema>
在架构中:
和
CustomerType
OrderType
类型声明是全局的,因此包含在架构的目标命名空间中。 因此,在元素及其<Order>
子元素的<Customer>
声明中引用这些类型时,会指定与目标命名空间关联的前缀。该
<Customer>
元素也包含在架构的目标命名空间中,因为它是架构中的全局元素。
针对该架构执行以下 XPath 查询:
(/CO:Customer[@CustomerID=1)
该 XPath 查询生成以下实例文档(仅显示了一部分订单):
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<y0:Customer xmlns:y0="urn:MyNamespace"
CustomerID="ALFKI" ContactName="Maria Anders">
<Order CustomerID="ALFKI" OrderID="10643" />
<Order CustomerID="ALFKI" OrderID="10692" />
...
</y0:Customer>
</ROOT>
此实例文档定义 urn:MyNamespace 命名空间,并将前缀 (y0) 关联到该命名空间。 前缀仅应用于 <Customer>
全局元素。 (该元素是全局的,因为它被声明为架构中的元素的 <xsd:schema>
子元素。
前缀不会应用于本地元素和属性,因为架构中设置了值 elementFormDefault
和 attributeFormDefault
属性 "unqualified"
。 元素<Order>
是局部元素,因为它的声明显示为定义<CustomerType>
元素的<complexType>
元素的子元素。 同样,属性(CustomerID
和OrderID
ContactName
)是本地属性,而不是全局属性。
创建此架构的工作示例
复制以前的架构代码并将其粘贴到文本文件中。 将文件另存为
targetNamespace.xml
。复制以下模板,并将它粘贴到文本文件中。 将文件另存为
targetNameSpaceT.xml
保存的同一目录中targetNamespace.xml
。<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="targetNamespace.xml" xmlns:CO="urn:MyNamespace"> /CO:Customer[@CustomerID=1] </sql:xpath-query> </ROOT>
模板中的 XPath 查询返回
<Customer>
CustomerID 为 1 的客户元素。 XPath 查询指定查询中元素的命名空间前缀,而不是指定属性的命名空间前缀。 (架构中指定的本地属性不限定)。为映射架构指定的目录路径 (
targetNamespace.xml
) 相对于保存模板的目录。 也可以指定绝对路径,例如:mapping-schema="C:\MyDir\targetNamepsace.xml"
创建并使用 SQLXML 4.0 测试脚本 (Sqlxml4test.vbs) 执行该模板。
有关详细信息,请参阅使用 ADO 执行 SQLXML 4.0 查询。
如果架构指定 elementFormDefault
并 attributeFormDefault
具有值 "qualified"
的属性,则实例文档具有限定的所有本地元素和属性。 可以更改以前的架构以在元素中包含 <xsd:schema>
这些属性,然后再次执行模板。 由于这些属性现在也限定在实例中,因此 XPath 查询会更改以包含命名空间前缀。
下面是修改后的 XPath 查询:
/CO:Customer[@CO:CustomerID=1]
下面是返回的 XML 文档:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<y0:Customer xmlns:y0="urn:MyNamespace" CustomerID="1" SalesPersonID="280">
<Order SalesOrderID="43860" CustomerID="1" />
<Order SalesOrderID="44501" CustomerID="1" />
<Order SalesOrderID="45283" CustomerID="1" />
<Order SalesOrderID="46042" CustomerID="1" />
</y0:Customer>
</ROOT>