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

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

可以使用 xsd:targetNamespace 属性将默认命名空间中的元素和属性放入其他命名空间。 还可以指定架构的本地声明元素和属性是否应以命名空间的形式显示限定,无论是使用前缀还是默认隐式显示。 可以使用 xsd:schema> 元素上的<elementFormDefaultattributeFormDefault 属性全局指定本地元素和属性的限定,也可以使用窗体属性单独指定单个元素和属性。

例子

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

答: 指定目标命名空间

以下 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. 复制以下模板,并将它粘贴到文本文件中。 将文件另存为 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 查询返回 <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>