XSD スキーマの記述では、XSD targetNamespace 属性を使用してターゲット名前空間を指定できます。 このトピックでは、XSD targetNamespace、 elementFormDefault、 attributeFormDefault 属性の動作、生成される XML インスタンスへの影響、および名前空間で XPath クエリを指定する方法について説明します。
xsd:targetNamespace 属性を使用して、既定の名前空間の要素と属性を別の名前空間に配置できます。 また、スキーマのローカルで宣言された要素と属性を、プレフィックスを使用して明示的に修飾するか、既定で暗黙的に修飾するかを指定することもできます。 <xsd:schema> 要素の elementFormDefault 属性と attributeFormDefault 属性を使用してローカル要素と属性の修飾をグローバルに指定したり、フォーム属性を使用して個々の要素と属性を個別に指定することができます。
例示
次の例を使用した実際のサンプルを作成するには、特定の条件を満たす必要があります。
詳細については、「
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>要素はローカルであることに注意してください。その宣言は、<CustomerType> 要素を定義する <complexType> 要素の子として表示されます。 同様に、属性 (CustomerID、 OrderID、 ContactName) はグローバルではなくローカルです。
このスキーマの作業サンプルを作成するには
上のスキーマのコードをコピーして、テキスト ファイルに貼り付け、 ファイルを targetNameSpace.xmlとして保存します。
次のテンプレートをコピーして、テキスト ファイルに貼り付け、 targetNamespace.xmlを保存したのと同じディレクトリにファイルを targetNameSpaceT.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>