使用 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> 是本機的元素,因為它的宣告會以 <complexType> 元素的子元素形式出現,該元素會定義 <CustomerType> 元素。同樣地,(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 查詢會針對 CustomerID 為 1 的客戶傳回 <Customer> 元素。請注意,XPath 查詢會針對此查詢中的元素 (而不是屬性) 來指定命名空間前置詞 (如同結構描述中所指定,本機屬性並未限定)。
針對對應結構描述 (targetNamespace.xml) 所指定的目錄路徑相對於儲存範本的目錄。您也可以指定絕對路徑,例如:
mapping-schema="C:\MyDir\targetNamepsace.xml"
建立及使用 SQLXML 4.0 Test Script (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>