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

适用于: SQL Server Azure SQL 数据库

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

可以使用该特性将 xsd:targetNamespace 默认命名空间中的元素和属性放入其他命名空间。 还可以指定在显示局部声明的架构元素和属性时,是否应由命名空间限定(使用前缀显式限定或默认隐式限定)。 可以使用elementFormDefault元素上的<xsd:schema>attributeFormDefault属性全局指定局部元素和属性的限定,也可以使用form该属性单独指定各个元素和属性。

示例

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

A. 指定目标命名空间

以下 XSD 架构使用 xsd:targetNamespace 特性指定目标命名空间。 架构还会将 elementFormDefaultattributeFormDefault 属性值设置为 "unqualified" (这些属性的默认值)。 这是一个全局声明,影响所有本地元素(<Order>架构)和属性(CustomerID以及ContactNameOrderID架构中)。

<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类型声明是全局的,因此包含在架构的目标命名空间中。 因此,在元素及其<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> 子元素。

前缀不会应用于本地元素和属性,因为架构中设置了值 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 查询返回 <Customer> CustomerID 为 1 的客户元素。 XPath 查询指定查询中元素的命名空间前缀,而不是指定属性的命名空间前缀。 (架构中指定的本地属性不限定)。

    为映射架构指定的目录路径 (targetNamespace.xml) 相对于保存模板的目录。 也可以指定绝对路径,例如:

    mapping-schema="C:\MyDir\targetNamepsace.xml"
    
  3. 创建并使用 SQLXML 4.0 测试脚本 (Sqlxml4test.vbs) 执行该模板。

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

如果架构指定 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>