XPath 查询使用简介 (SQLXML 4.0)

XML Path 语言 (XPath) 查询可以指定作为 URL 的一部分,或在模板内指定。映射架构决定生成的此片段的结构,值从数据库中进行检索。从概念上来说,此过程类似于使用 CREATE VIEW 语句创建视图,然后根据视图编写 SQL 查询。

注意注意

若要了解 SQLXML 4.0 中的 XPath 查询,必须熟悉 XML 视图和相关的概念,如模板和映射架构。有关详细信息,请参阅带批注的 XSD 架构简介 (SQLXML 4.0),以及万维网联盟 (W3C) 制定的 XPath 标准。

XML 文档由多个节点构成,如元素节点、属性节点、文本节点等。例如,考虑以下 XML 文档:

<root>
  <Customer cid= "C1" name="Janine" city="Issaquah">
      <Order oid="O1" date="1/20/1996" amount="3.5" />
      <Order oid="O2" date="4/30/1997" amount="13.4">Customer was
          very satisfied</Order>
   </Customer>
   <Customer cid="C2" name="Ursula" city="Oelde" >
      <Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue white red">
          <Urgency>Important</Urgency>
      </Order>
      <Order oid="O4" date="1/20/1996" amount="10000"/>
   </Customer>
</root>

在此文档中,<Customer> 是元素节点,cid 是属性节点,"Important" 是文本节点。

XPath 是图形导航语言,用于从 XML 文档中选择节点集。每个 XPath 运算符根据前一个 XPath 运算符所选择的节点集来选择节点集。例如,给定 <Customer> 节点集,XPath 可以用 date 属性值 "7/14/1999" 来选择所有 <Order> 节点。生成的节点集包含订单日期为 7/14/1999 的所有订单。

万维网联盟 (W3C) 将 XPath 语言规定为标准导航语言。SQLXML 4.0 实现了 W3C XPath 规范的子集,该规范的网址为 http://www.w3.org/TR/1999/PR-xpath-19991008.html。

以下是 W3C XPath 实现与 SQLXML 4.0 实现之间的主要差异。

  • 根查询

    SQLXML 4.0 不支持根查询 (/)。每个 XPath 查询在架构中必须以顶级 <ElementType> 开头。

  • 报告错误

    W3C XPath 规范定义了无错误条件。选择任意节点失败的 XPath 查询将返回空节点集。在 SQLXML 4.0 中,查询可能返回多种类型的错误消息。

  • 文档顺序

    在 SQLXML 4.0 中,文档顺序并不总是确定的。因此,无法实现使用文档顺序(如 following)的数值谓词和轴。

    缺少文档顺序还表示,只有在节点映射到单行中的单列时,才能计算该节点的字符串值。包含子元素的元素或 IDREFS 或 NMTOKENS 节点无法转换为字符串。

    注意注意

    在某些情况下,key-fields 批注或 relationship 批注中的关键字可以生成确定的文档顺序。不过,这并非这些批注的主要用途。有关详细信息,请参阅使用 sql:key-fields 标识键列 (SQLXML 4.0)使用 sql:relationship 指定关系 (SQLXML 4.0)

  • 数据类型

    SQLXML 4.0 在实现 XPath string、number 和 boolean 数据类型时存在局限性。有关详细信息,请参阅 XPath 数据类型 (SQLXML 4.0)

  • 叉积查询

    SQLXML 4.0 不支持叉积 XPath 查询,如 Customers[Order/@OrderDate=Order/@ShipDate]。此查询用于选择其任意订单的 OrderDate 等于任意订单的 ShipDate 的所有客户。

    不过,SQLXML 4.0 支持诸如 Customer[Order[@OrderDate=@ShippedDate]] 的查询,此查询用于选择其任意订单的 OrderDate 等于其 ShipDate 的客户。

  • 错误处理和安全性

    根据所用架构和 XPath 查询表达式的不同,Transact-SQL 错误可以在某些条件下向用户公开。

以下部分中的表格详细列出了 SQLXML 4.0 中的 XPath 查询实现与 W3C 规范在这些方面的不同之处。

支持的功能

下表显示了 SQLXML 4.0 中实现的 XPath 语言功能。

功能

示例查询链接

attribute、child、parent 和 self 轴

在 XPath 查询中指定轴 (SQLXML 4.0)

包含连续谓词和嵌套谓词的布尔值谓词

 

在 XPath 查询中指定算数运算符 (SQLXML 4.0)

所有关系运算符

=、!=、<、<=、>、>=

在 XPath 查询中指定关系运算符 (SQLXML 4.0)

算术运算符

+、-、*、div

在 XPath 查询中指定算数运算符 (SQLXML 4.0)

显式转换函数

number()、string()、Boolean()

在 XPath 查询中指定显式转换函数 (SQLXML 4.0)

布尔运算符

AND、OR

在 XPath 查询中指定布尔运算符 (SQLXML 4.0)

布尔函数

true()、false()、not()

在 XPath 查询中指定布尔函数 (SQLXML 4.0)

XPath 变量

 

在 XPath 查询中指定 XPath 变量 (SQLXML 4.0)

不支持的功能

下表显示了 SQLXML 4.0 中未实现的 XPath 语言功能。

功能

ancestor、ancestor-or-self、descendant、descendant-or-self (//)、following、following-sibling、namespace、preceding、preceding-sibling

数值谓词

 

算术运算符

mod

节点函数

ancestor、ancestor-or-self、descendant、descendant-or-self (//)、following、following-sibling、namespace、preceding、preceding-sibling

字符串函数

string()、concat()、starts-with()、contains()、substring-before()、substring-after()、substring()、string-length()、normalize()、translate()

布尔函数

lang()

数字函数

sum()、floor()、ceiling()、round()

UNION 运算符

|

在模板中指定 XPath 查询时,请注意以下行为:

  • XPath 可以包含在 XML 中具有特殊含义的字符,如 < 或 &(模板为 XML 文档)。必须使用 XML & 编码对这些字符进行转义,或在 URL 中指定 XPath。