XPath クエリの使用について (SQLXML 4.0)
適用対象: SQL Server Azure SQL データベース
XML パス言語 (XPath) クエリは、URL の一部として、またはテンプレート内で指定できます。 この結果のフラグメントの構造はマッピング スキーマによって決定され、値はデータベースから取得されます。 このプロセスは、CREATE VIEW ステートメントを使用してビューを作成し、そのビューに対して SQL クエリを記述するのと概念的には同じです。
Note
SQLXML 4.0 の XPath クエリを理解するには、XML ビューと、それに関連するテンプレートやマッピング スキーマなどの概念について理解している必要があります。 詳細については、「 注釈付き XSD スキーマへの導入 (SQLXML 4.0)と、World Wide Web Consortium (W3C) で定義されている XPath 標準に関するページを参照してください。
XML ドキュメントは、要素ノード、属性ノード、テキスト ノードなどのノードで構成されます。 たとえば、次の XML ドキュメントを考えてみます。
<root>
<Customer cid= "C1" name="Janine" city="Issaquah">
<Order oid="O1" date="1/20/1996" amount="3.5" />
<Order oid="O2" date="4/30/1997" amount="13.4">Customer was
very satisfied</Order>
</Customer>
<Customer cid="C2" name="Ursula" city="Oelde" >
<Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue white red">
<Urgency>Important</Urgency>
</Order>
<Order oid="O4" date="1/20/1996" amount="10000"/>
</Customer>
</root>
このドキュメントでは、 <Customer> は要素ノード、 cid は属性ノード、 "重要" はテキスト ノードです。
XPath は、XML ドキュメントからノード セットを選択するときに使用できるグラフ ナビゲーション言語です。 XPath の各演算子では、前の XPath 演算子によって選択されたノード セットに基づいて、ノード セットを選択します。 たとえば、<Customer> ノードのセットを指定すると、XPath では、date 属性値が "7/14/1999" であるすべての <Order> ノードを選択できます。 結果のノード セットには、注文日が 1999 年 7 月 14 日となっているすべての注文が含まれます。
XPath 言語は W3C (World Wide Web Consortium) によって標準のナビゲーション言語として定義されています。 SQLXML 4.0 は、 http://www.w3.org/TR/1999/PR-xpath-19991008.htmlにある W3C XPath 仕様のサブセットを実装します。
次に、W3C XPath 実装と SQLXML 4.0 実装の主な違いを示します。
ルート クエリ
SQLXML 4.0 では、ルート クエリ (/) はサポートされません。 すべての XPath クエリは、スキーマの最上位レベルの <ElementType> で開始する必要があります。
エラーの報告
W3C XPath 仕様では、エラー状態は定義されていません。 ノードの選択に失敗した XPath クエリでは、空のノード セットが返されます。 SQLXML 4.0 では、さまざまな種類のエラー メッセージが返されます。
ドキュメントの順序
SQL XML 4.0 では、ドキュメント序数が必ずしも決まっていません。 そのため、ドキュメントの順序を使用する数値述語と軸 ( フォローなど) は実装されません。
ドキュメント序数がないため、ノードの文字列値は、ノードが単一行の単一列にマップされる場合にのみ評価できます。 子要素を含む要素や IDREFS または NMTOKENS ノードは、文字列に変換できません。
Note
場合によっては、 key-fields 注釈、または relationship 注釈のキーによって、ドキュメントの順序が決定論的になる可能性があります。 ただし、これはこれらの注釈の主な用途ではありません。詳細については、「 sql:key-fields (SQLXML 4.0) を使用したキー列の識別」 および 「sql:relationship を使用したリレーションシップの指定 (SQLXML 4.0)」を参照してください。
データ型
SQLXML 4.0 には、XPath string、 number、および boolean データ型の実装に制限があります。 詳細については、「 XPath データ型 (SQLXML 4.0)を参照してください。
製品間クエリ
SQLXML 4.0 では、
Customers[Order/@OrderDate=Order/@ShipDate]
などのクロス積 XPath クエリはサポートされません。 このクエリでは、任意の Order の OrderDate が任意の Order の ShipDate と等しいすべての Customer が選択されます。ただし、SQLXML 4.0 では、
Customer[Order[@OrderDate=@ShippedDate]]
などのクエリはサポートされます。このクエリでは、任意の Order の OrderDate とその ShipDate が等しいすべての Customer が選択されます。エラー処理とセキュリティ
使用されるスキーマと XPath クエリ式によっては、Transact-SQL エラーが特定の条件下でユーザーに公開される可能性があります。
以下に示す表では、この分野に関する SQLXML 4.0 の XPath クエリの実装と W3C 仕様の違いを詳しく説明します。
サポートされる機能
次の表は、SQLXML 4.0 で実装されている XPath 言語の機能です。
機能 | 項目 | サンプル クエリへのリンク |
---|---|---|
Axes | attribute、child、parent、および軸 | XPath クエリでの軸の指定 (SQLXML 4.0) |
連続する述語や入れ子になった述語など、ブール値を使用する述語 | XPath クエリでの算術演算子の指定 (SQLXML 4.0) | |
すべての関係演算子 | =、!=、 <、 <=、 >、 >= | XPath クエリでの関係演算子の指定 (SQLXML 4.0) |
算術演算子 | +、-、*、div | XPath クエリでの算術演算子の指定 (SQLXML 4.0) |
明示的な変換関数 | number(), string(), Boolean() | XPath クエリでの明示変換関数の指定 (SQLXML 4.0) |
ブール演算子 | AND、OR | XPath クエリでのブール演算子の指定 (SQLXML 4.0) |
ブール関数 | true(), false(), not() | XPath クエリでのブール関数の指定 (SQLXML 4.0) |
XPath 変数 | XPath クエリでの XPath 変数の指定 (SQLXML 4.0) |
サポートされていない機能
次の表は、SQLXML 4.0 で実装されていない XPath 言語の機能です。
機能 | 項目 |
---|---|
Axes | 先祖、 ancestor-or-self、 descendant、 descendant-or-self (//)、 following-sibling、 following-sibling、 namespace、 preceding、 preceding-sibling |
数値を使用する述語 | |
算術演算子 | mod |
ノード関数 | 先祖、 ancestor-or-self、 descendant、 descendant-or-self (//)、 following-sibling、 following-sibling、 namespace、 preceding、 preceding-sibling |
文字列関数 | string(), concat(), starts-with()、 contains()、 substring-before()、 substring-after()、 substring()、 string-length()、 normalize()、 translate() |
ブール関数 | lang() |
Numeric 関数 | sum(), floor(), ceiling(), round() |
Union 演算子 | | |
テンプレートに XPath クエリを指定する場合には、次の動作に注意してください。
- XPath には、XML で特別な意味を持つ < や > などの文字を含めることができます (テンプレートは XML ドキュメントです)。 XML エンコードを使用してこれらの文字をエスケープするか、URL に XPath を指定する必要があります。