在路徑運算式中使用縮寫語法

在<瞭解 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.Contact           
     WHERE ContactID=1           
    

    如果您以縮寫語法 //act:telephoneNumber 取代路徑運算式,您會收到相同的結果。

  • 在步中的 self::node() 可以縮寫成單點 (.)。不過,點不等於或無法與 self::node() 互換使用。
    例如,在下列查詢中,點的使用代表是一個值且不是節點:

    ("abc", "cde")[. > "b"]
    
  • 在步中的 parent::node() 可以縮寫成雙點 (.)。