targetNamespace 属性を使用してターゲット名前空間を指定する (SQLXML 4.0)
適用対象: SQL Server Azure SQL データベース
XSD スキーマの記述では、XSD targetNamespace
属性を使用してターゲット名前空間を指定できます。 この記事では、XSD targetNamespace
、 elementFormDefault
、および attributeFormDefault
属性の動作、生成される XML インスタンスへの影響、および名前空間で XPath クエリを指定する方法について説明します。
xsd:targetNamespace
属性を使用して、既定の名前空間の要素と属性を別の名前空間に配置できます。 また、スキーマでローカルに宣言された要素と属性を、名前空間で修飾して表示するかどうかも指定できます。名前空間は、プレフィックスを使って明示的に、または既定により暗黙的に指定できます。 <xsd:schema>
要素のelementFormDefault
属性とattributeFormDefault
属性を使用してローカル要素と属性の修飾をグローバルに指定することも、form
属性を使用して個々の要素と属性を個別に指定することもできます。
例
次の例を使用した実際のサンプルを作成するには、特定の条件を満たす必要があります。 詳細については、「
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\targetNamespace.xml"
SQLXML 4.0 テスト スクリプト (sqlxml4test.vbs) を作成し、それを使用してテンプレートを実行します。
詳細については、「ADO を使用した SQLXML 4.0 クエリの実行」を参照してください。
スキーマで値"qualified"
を持つelementFormDefault
属性と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>