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> 要素はローカルであることに注意してください。この要素の宣言は、<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 4.0 クエリの実行」を参照してください。
スキーマ内で、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>