XPath クエリの使用について (SQLXML 4.0)

適用対象: SQL Server Azure SQL Database

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 stringnumber、および 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 attributechildparent、および 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-selfdescendantdescendant-or-self (//)following-siblingfollowing-siblingnamespaceprecedingpreceding-sibling
数値を使用する述語
算術演算子 mod
ノード関数 先祖ancestor-or-selfdescendantdescendant-or-self (//)following-siblingfollowing-siblingnamespaceprecedingpreceding-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 を指定する必要があります。

参照

SQLXML 4.0 での XPath クエリの使用