在路径表达式中使用缩写语法
了解 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() 缩写为两点 (..)。