XML 路径语言 (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 是属性节点, “重要” 是文本节点。
XPath 是一种图形导航语言,用于从 XML 文档中选择一组节点。 每个 XPath 运算符根据先前 XPath 运算符选择的节点集选择节点集。 例如,给定一组<客户>节点,XPath 可以选择日期属性值为“7/14/1999”的所有<订单>节点。 生成的节点集包含订单日期为 1999 年 7 月 14 日的所有订单。
XPath 语言由万维网联盟(W3C)定义为标准导航语言。 SQLXML 4.0 实现位于 http://www.w3.org/TR/1999/PR-xpath-19991008.html的 W3C XPath 规范的子集。
以下是 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
stringnumber和boolean数据类型方面存在限制。 有关详细信息,请参阅 XPath 数据类型(SQLXML 4.0)。跨产品查询
SQLXML 4.0 不支持跨产品 XPath 查询,例如
Customers[Order/@OrderDate=Order/@ShipDate]。 此查询选择 OrderDate 等于任何订单的任何订单的所有客户。但是,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 |
| 数值谓词 | |
| 算术运算符 | 国防部 |
| 节点函数 |
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。