在撰寫 XSD 架構時,您可以使用 XSD targetNamespace 屬性來指定目標命名空間。 本主題描述 XSD targetNamespace、elementFormDefault 和 attributeFormDefault 屬性的運作方式、它們如何影響產生的 XML 實例,以及如何使用命名空間來指定 XPath 查詢。
您可以使用 xsd:targetNamespace 屬性,將預設命名空間中的項目和屬性放入不同的命名空間。 您也可以指定架構的本機宣告專案和屬性是否應該以命名空間明確顯示,方法是使用前置詞或隱含預設。 您可以使用 xsd:schema> 元素上的<elementFormDefault 和 attributeFormDefault 屬性,全域指定局部元素和屬性的限定性,也可以使用窗體屬性來個別指定個別元素和屬性。
範例
若要使用下列範例建立工作範例,您必須符合特定需求。 如需詳細資訊,請參閱 執行 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 屬性的值設定為架構中的 「不限定」 。 請注意,<Order> 元素是本機的,因為它的宣告會顯示為定義 CustomerType 元素之 complexType> 元素的<子系。>< 同樣地,屬性 (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 測試腳本 (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>