在撰寫 XSD 架構時,您可以使用 XSD targetNamespace 屬性來指定目標命名空間。 本文說明 XSD targetNamespace、 elementFormDefault和 attributeFormDefault 屬性的運作方式、它們如何影響產生的 XML 實例,以及如何使用命名空間來指定 XPath 查詢。
您可以使用 xsd:targetNamespace 屬性,將預設命名空間中的元素和屬性放入不同的命名空間。 您也可以指定架構的本機宣告專案和屬性是否應該以命名空間明確顯示,方法是使用前置詞或隱含預設。 您可以使用 elementFormDefault 元素上的 <xsd:schema> 和 attributeFormDefault 屬性,全域指定區域元素和屬性的限定性,也可以使用 form 屬性來個別指定個別元素和屬性。
範例
若要使用下列範例建立工作範例,您必須符合特定需求。 如需詳細資訊,請參閱 執行 SQLXML 範例的需求。
A. 指定目標命名空間
下列 XSD 架構會使用 xsd:targetNamespace 屬性來指定目標命名空間。 架構也會將和 attributeFormDefault 屬性值設定elementFormDefault為 "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型別宣告是全域的,因此會包含在架構的目標命名空間中。 因此,當這些型別在元素及其<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> 系。
前置詞不會套用至本機元素和屬性,因為 和屬性的值elementFormDefault是在架構中設定為 "unqualified" 。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 查詢會
<Customer>傳回 CustomerID 為 1 的客戶元素。 XPath 查詢會指定查詢中專案的命名空間前置詞,而不是 屬性的命名空間前置詞。 (如架構中所指定,本機屬性不限定。為對應架構指定的目錄路徑 (
targetNamespace.xml) 相對於儲存範本的目錄。 您也可以指定絕對路徑,例如:mapping-schema="C:\MyDir\targetNamespace.xml"建立並使用 SQLXML 4.0 測試腳本 (Sqlxml4test.vbs) 來執行範本。
如需詳細資訊,請參閱使用 ADO 執行 SQLXML 4.0 查詢。
如果架構指定 elementFormDefault 具有 值的 "qualified"和 attributeFormDefault 屬性,則實例檔具有所有區域元素和屬性都限定。 您可以變更先前的架構,以在 元素中包含 <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>