在路徑運算式中使用縮寫語法
在<了解 XQuery 中的路徑運算式> 中的所有範例均使用路徑運算式的不縮寫語法。在路徑運算式中軸步的不縮寫語法包含軸名稱與節點測試,並以雙冒號分隔,後面接著零步或多步的限定詞。
例如:
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.Person WHERE BusinessEntityID = 291;
如果您以縮寫語法 //act:telephoneNumber 取代路徑運算式,您會收到相同的結果。
在步中的 self::node() 可以縮寫成單點 (.)。不過,點不等於或無法與 self::node() 互換使用。
例如,在下列查詢中,點的使用代表是一個值且不是節點:
("abc", "cde")[. > "b"]
在步中的 parent::node() 可以縮寫成雙點 (.)。