路径表达式 - 使用缩写语法

适用于:SQL Server

了解 XQuery 中的路径表达式中的所有示例都对路径表达式使用不加注释的语法。 路径表达式中用于轴步骤的未缩写语法包括轴名称和节点测试(用双冒号分隔),后跟零或更多个步骤限定符。

例如:

child::ProductDescription[attribute::ProductModelID=19]  

XQuery 支持在路径表达式中使用下列缩写:

  • 轴是默认轴。 因此,可以从表达式中的步骤中省略 child:: 轴。 例如,/child::ProductDescription/child::Summary 可以写为 /ProductDescription/Summary

  • 属性轴可以缩写为 @。 例如,/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="https://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 () 可以缩写为双点 (。) 。