在路径表达式中使用缩写语法

了解 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() 缩写为两点 (..)。