使用 targetNamespace 属性指定目标命名空间 (SQLXML 4.0)

编写 XSD 架构时,可以使用 XSD targetNamespace 属性指定目标命名空间。本主题说明 XSD targetNamespaceelementFormDefaultattributeFormDefault 属性的工作原理、它们如何影响生成的 XML 实例,以及如何使用命名空间指定 XPath 查询。

可以使用 xsd:targetNamespace 属性将默认命名空间中的元素和属性放入不同的命名空间。还可以指定在显示局部声明的架构元素和属性时,是否应由命名空间限定(使用前缀显式限定或默认隐式限定)。可以对 <xsd:schema> 元素使用 elementFormDefaultattributeFormDefault 属性,以便全局指定对局部元素和属性的限定,或者可以使用 form 属性分别指定各个元素和属性。

示例

若要创建使用以下示例的工作示例,必须满足某些要求。有关详细信息,请参阅运行 SQLXML 示例的要求

A. 指定目标命名空间

以下 XSD 架构通过使用 xsd:targetNamespace 属性指定目标命名空间。该架构还将 elementFormDefaultattributeFormDefault 的属性值设置为 "unqualified"(这些属性的默认值)。这是全局声明,所以影响所有局部元素(架构中的 <Order>)和属性(架构中的 CustomerIDContactNameOrderID)。

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

在架构中:

  • CustomerTypeOrderType 类型声明是全局的,所以包括在该架构的目标命名空间中。因此,在 <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> 元素的子元素,所以是个全局元素。)

由于 elementFormDefaultattributeFormDefault 属性在架构中设置为 "unqualified",所以该前缀不适用于局部元素和属性。请注意,<Order> 是局部元素,因为其声明显示为定义 <CustomerType> 元素的 <complexType> 元素的子元素。同样,属性(CustomerIDOrderIDContactName)也是局部属性而非全局属性。

创建此架构的工作示例

  1. 复制上面的架构代码,并将它粘贴到文本文件中。将文件另存为 targetNameSpace.xml。

  2. 复制以下模板,并将它粘贴到文本文件中。在保存 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"
    
  3. 创建并使用 SQLXML 4.0 测试脚本 (Sqlxml4test.vbs) 执行该模板。

    有关详细信息,请参阅使用 ADO 执行 SQLXML 查询

如果该架构将 elementFormDefaultattributeFormDefault 属性的值指定为 "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>