パス式での省略構文の使用
「パス式 (XQuery)」の例はすべて、パス式に省略構文を使用しています。パス式の軸ステップの省略構文では、軸名とノード テストを 2 つのコロン (::) で区切り、その後にステップ修飾子を指定します。ステップ修飾子は、指定しなくてもかまいません。
次に例を示します。
child::ProductDescription[attribute::ProductModelID=19]
XQuery は、パス式で次の省略をサポートしています。
child 軸は既定の軸です。したがって、child:: 軸は、式のステップから省略できます。たとえば、/child::ProductDescription/child::Summary は /ProductDescription/Summary のように記述できます。
attribute は @ に省略できます。たとえば、/child::ProductDescription[attribute::ProductModelID=10] は /ProudctDescription[@ProductModelID=10] のように記述できます。
/descendant-or-self::node()/ は // に省略できます。たとえば、/descendant-or-self::node()/child::act:telephoneNumber は //act:telephoneNumber のように記述できます。
上記のクエリは、Contact テーブルの AdditionalContactInfo 列に格納されているすべての電話番号を取得しています。AdditionalContactInfo のスキーマは、<telephoneNumber> 要素をドキュメントのどこにでも配置できるような方法で定義します。したがって、すべての電話番号を取得するには、ドキュメント内のすべてのノードを検索する必要があります。検索は、ドキュメントのルートから開始され、続いてすべての子孫ノードが検索されます。
次のクエリは、特定の顧客の電話番号をすべて取得します。
SELECT AdditionalContactInfo.query(' declare namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes"; declare namespace crm="http://schemas.adventure-works.com/Contact/Record"; declare namespace ci="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo"; /descendant-or-self::node()/child::act:telephoneNumber ') as result FROM Person.Contact WHERE ContactID=1
パス式を省略構文の //act:telephoneNumber に置き換えても、同じ結果が得られます。
ステップの self::node() は、1 つのドット (.) に省略できます。ただし、ドットと self::node() が等価であるということではなく、両者を双方向に置き換えることはできません。
たとえば、次のクエリでは、ドットを使用して、ノードではなく値を表しています。
("abc", "cde")[. > "b"]
ステップの parent::node() は、2 つのドット (..) に省略できます。