用于数据的 XML: XPath 2.0 有哪些新特性?

来源:百度文库 编辑:神马文学网 时间:2024/04/26 07:00:23

内容:

xf:distinct-values 函数

xf:document 函数

xf:current-dateTime 函数

更佳的 XML 模式兼容性

参考资料

关于作者

对本文的评价


相关内容:

XSLT 2.0:早期研究

在 Java 中使用 DOM 和 XPath 进行有效的 XML 处理



订阅:

developerWorks 时事通讯




对 XPath 2.0 计划采用的一些特性的前瞻
Kevin Williams
CTO, Blue Oxide Technologies,LLC
2003 年 1 月
Kevin Williams 研究了 XPath 2.0 规范的最新状态,并且提供了一些 XPath 2.0 特性的特定示例,这些特性会使 XML 开发人员的工作更加轻松。示例是用 XML 和 XPath 的形式提供的。
XSLT 1.0 和 XPath 1.0 最初是打算为 XML 文档提供简单的样式语言支持,主要是将这些文档转换成 HTML 以呈现在浏览器中。但是,自从 XSLT 和 XPath 可以使用之后,它们就被强行用于各种任务中,而这些任务 ― 从 XML 文档中复杂的数据操作(聚合、单值选择和关系旋转)到一种 XML 形式向另一种形式的 XSLT 转换 ― 并不是它们的设计初衷。在这些规范的版本 2.0 中,W3C 试图使 XSLT 和 XPath 更加灵活和健壮,以便于处理这些技术的新用法。
在上一篇专栏文章中,我研究了 XSLT 的一些新特性。在本篇专栏文章中,我只研究 XPath2.0 的几个要点 ― 由于要点太多,因而无法在一篇专栏文章中全部研究。
对于本专栏而言,特定前缀的映射含义如下: xf: 前缀被认为映射到 XPath 2.0 函数名称空间(http://www.w3.org/2002/08/xquery-functions)。 xsl: 前缀映射到 XSLT 2.0 名称空间。 xs: 前缀映射到 XML 模式名称空间。
在使用 XSLT 1.0 样式表时,开发人员面临的最重大的挑战之一就是编写与 SQL 中 SELECT DISTINCT 等同功能的 XML 代码 ― 即一个获取节点集并返回那些节点唯一值列表的表达式。在 XSLT 1.0 和 XPath 1.0 中这不是不可能实现的,但都是极其困难的。基本上,您都必须写一条 xsl:for-each 语句以特殊的排序顺序对每个节点求值,然后不断回头查看节点列表,以了解是否所有匹配特定值的任何其它节点都被处理了。有了 XSLT 2.0 ,以及引入了 xf:distinct-values 函数,这个问题就迎刃而解了。下面清单 1中是一个 XML 文档的快速示例:

假定您想要标准化输出作者信息,并创建一个类似清单 2的文档:

要做到这一点,使用 XPath 和 XSLT 1.0 时,需要做类似于清单 3的工作:

记录文档的过程稍微有点凌乱和困难,但是使用 xf:distinct ,这会变的很容易,如清单 4所示:

这与 xsl:for-each-group 有什么区别呢?任何实现 XPath 的地方都可以使用 xf:distinct ― 因此,它可以作为 XQuery 1.0 的一部分及专门的 XPath 处理器使用。利用 xf:distinct ,可以在值集合上执行其它操作,这与 xsl:for-each-group 相反,后者强制对不同的值单独进行操作。
这一变化解决了 XSLT 作者在试图样式化文档时遇到的许多问题。XSLT 还有许多其它变化,样式表程序员会发现它们非常有用。
在 XSLT 1.0 中使用多个文档是有问题的。XPath 2.0 的设计人员明智地选择了通过 xf:document 机制来包括额外的文档处理能力。该函数允许从 URL 装入一个或多个文档,并进行处理。例如,假定您在资源库中拥有清单 5、6 和 7中所示的文档类型:



假定您现在在一个目录中有 500 个这样的文档,您希望创建您所拥有的所有蓝色零件的列表。无需利用中间层语言(如 Java)编写代码以装入所有这些文档并查找颜色为蓝色的零件,可以编写一个列出在哪可以找到所有零件的索引(请参阅清单 8):

您可以编写一个为您完成这项工作的样式表,其代码片段类似于清单 9:

这种技术特别适用于分布式网络的内容,在分布式网络中,零件信息可以放在一台服务器上,而客户信息可以放在另一台服务器上。通过利用样式表(使用 xf:document 从其它 URL“拉”信息),允许该数据可以在创建它的地方起作用。
将样式表应用于 XML 文档时,在输出中包含已转换结果的创建日期通常都很有用。当创建 HTML 文档以驱动用户界面时,这特别重要;此类信息可以帮助高速缓存系统知道什么时候信息的副本失效了。使用 XPath 2.0 中的 xf:current-dateTime 函数可以获得当前日期和时间(请参阅清单 10):

这可能会返回清单 11中所示的字符串:
2002-09-17T18:22:08z
然后,可以“按现状”使用该字符串,或者将其转换成不同的日期格式,以便于在生成的文档中使用。
因为 XPath 2.0 目前在 XSLT 2.0 和 XQuery 1.0 之间共享,因此,XPath 需要更健壮的 XML 模式支持。实际上,XPath 2.0 中的整个数据模型目前都是强类型的:而不是简单的字符串、数字和布尔类型,值目前使用了作为 XML 模式规范一部分定义的原语。提供了完整的函数集,因此可以把这些值显式地从一种类型转换为另一种类型,将这种转换作为它们在 XPath 2.0 中操作的一部分。例如,通过使用类型名称可以将一个值强制转换为另一种类型,就象是一个函数一样。因此,使用清单 12中的代码片段,可以将值强制转换为无符号整数:
xs:unsignedInt(item)
XPath 2.0 中的强类型确保由 XSLT 样式表创建的文档能够依据强类型的 XML 模式进行验证。在 XSLT 2.0 之前,没有方法可以保证这一点(例如,保证数字是无符号整数)― 为了确保样式表不提供错误值,XML 模式验证步骤是必需的。
在本文中,我只是略微谈及了 XPath 2.0 必须提供的一些要点。虽然距离这项技术提升为建议书状态还有一段时日(至少 6 个月),但是,熟悉 XPath 2.0 的特性和功能将有助于您在开始实现时能够充分利用它。
您可以参阅本文在 developerWorks 全球站点上的英文原文.
请通过单击本文顶部或底部的 讨论来参与本文的论坛。
理解XPath 2.0 规范以及对这个重要规范所做的更改。
探究XQuery 1.0 and XPath 2.0 Data Model及类型确定系统的变化,并且探究支持 XPath 的处理器处理信息的方法。
查看XQuery 1.0 and XPath 2.0 Functions and Operators,因为它列举了 XPath 2.0 添加的许多新函数和运算符。
在developerWorks XML 技术专区上查找更多参考资料。
获取IBM WebSphere Studio Application Developer,它是一个易于使用的集成开发环境,用于构建、测试和部署 J2EE 应用程序,包括从 DID 和模式生成 XML 文档。
查看如何成为XML 和相关技术的 IBM 认证开发人员。
在 Kevin Williams 的 XML for Data专栏查找其它文章。
关于作者
Kevin Williams Blue Oxide Technologies,LLC 的技术主管(CTO),该公司从事 XML 和 XML Web 服务设计软件的设计业务。请访问该公司的网站http://www.blueoxide.com。可以通过kevin@blueoxide.com向 Kevin 提出意见。
_xyz