使用 targetNamespace 属性指定目标命名空间 (SQLXML 4.0)
编写 XSD 架构时,可以使用 XSD targetNamespace 属性指定目标命名空间。本主题说明 XSD targetNamespace、elementFormDefault 和 attributeFormDefault 属性的工作原理、它们如何影响生成的 XML 实例,以及如何使用命名空间指定 XPath 查询。
可以使用 xsd:targetNamespace 属性将默认命名空间中的元素和属性放入不同的命名空间。还可以指定在显示局部声明的架构元素和属性时,是否应由命名空间限定(使用前缀显式限定或默认隐式限定)。可以对 <xsd:schema> 元素使用 elementFormDefault 和 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 类型声明是全局的,所以包括在该架构的目标命名空间中。因此,在 <Customer> 元素及其 <Order> 子元素的声明中引用这些类型时,将指定与目标命名空间关联的前缀。
<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。
复制以下模板,并将它粘贴到文本文件中。在保存 targetNamespace.xml 的目录中将该文件另存为 targetNameSpaceT.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 查询为 CustomerID 为 1 的客户返回 <Customer> 元素。请注意,XPath 查询为查询中的元素(而不是属性)指定命名空间前缀。(根据架构中的指定,未限定局部属性。)
为映射架构 (targetNamespace.xml) 指定的目录路径是相对于模板保存目录的相对路径。也可以指定绝对路径,例如:
mapping-schema="C:\MyDir\targetNamepsace.xml"
创建并使用 SQLXML 4.0 测试脚本 (Sqlxml4test.vbs) 执行该模板。
有关详细信息,请参阅使用 ADO 执行 SQLXML 查询。
如果该架构将 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>