XQuery/优势
XQuery 的主要优势是
- 表达能力 - XQuery 可以查询许多不同的数据结构,其递归特性使其成为查询树和图结构的理想选择
- 简洁性 - XQuery 语句比类似的 SQL 或 XSLT 程序更短
- 灵活性 - XQuery 可以查询分层和表格数据
- 一致性 - XQuery 具有统一的语法,可以与其他 XML 标准(如 XML Schema 数据类型)一起使用
XQuery 通常与另外两种语言 SQL 和 XSLT 相比较,但与它们相比,XQuery 具有许多优势。
与 SQL 不同的是,XQuery 返回的不仅是表格,而是任意树结构。这使得 XQuery 可以直接创建可以在网页中使用的 XHTML 结构。XQuery 适用于基于 XML 的对象数据库,对象数据库比以纯粹表格格式存储的数据库更加灵活和强大。
与 XSLT 不同的是,任何熟悉 SQL 的人都可以学习 XQuery。许多结构非常相似,例如
- 排序结果: XQuery 和 SQL 都在查询中添加了
order by
子句。 - 选择不同值: XQuery 和 SQL 都具有从结果集中选择不同值的简单方法
- 限制行: XQuery 和 SQL 都有一个 WHERE X=Y 子句,可以添加到 XQuery 中
另一个很大的优势是,XQuery 本质上是万维网的原生查询语言。可以使用 XQuery 查询实际网页,但不能使用 SQL。即使使用基于 SQL 的数据库来存储 HTML/XHTML 页面或此类页面的片段,也会错过 XQuery 的简单标签/属性搜索(类似于在列名中搜索列名)的许多优点。
与 XSLT 不同的是,任何熟悉 SQL 的人都可以快速学习 XQuery。XSLT 有许多对于许多程序员来说不熟悉的模式。此外,XSLT 擅长用作将一种类型的文档转换为另一种类型的文档(例如 RSS 到 HTML)的静态方法,而 XQuery 是一种更加动态的查询工具,适用于从大型文档或大量文档中提取数据部分。
关于两种语言用于转换 XML 的优劣,一直存在着争议:XSLT 和 XQuery。一个常见的误解是,“XQuery 最适合查询或选择 XML,而 XSLT 最适合转换 XML。”实际上,两种方法都能转换 XML。尽管 XSLT 历史更悠久,安装基础更大,但“XQuery 类型切换”转换 XML 的方法提供了许多优势。
大多数需要转换 XML 的人听说他们需要学习一种叫做 XSLT 的语言。XSLT 的第一个版本由 W3C 于 1999 年发布,在其时代是一个巨大的创新,而且的确仍然占主导地位。它是最早专门用于转换 XML 文档的语言之一,也是第一个使用来自函数式编程世界的先进理论来创建非常可靠、无副作用的转换的领域特定语言 (DSL)。许多 XML 开发人员仍然对这种开创性的语言心存感激,因为它帮助他们看到了软件开发的新模型:一个以模型转换为中心并授权他们将转换路由的既定要求和文档融合到单个、模块化程序中的模型。
另一方面,学习 XSLT 需要克服非常大的学习曲线。XSLT 的难度在一定程度上是由于其架构师的一项关键设计决策:使用 XML 本身来表达转换规则,而不是为存储转换规则创建全新的语法和语法。XSLT 对转换规则的独特方法也增加了学习曲线的陡峭程度。学习曲线可以克服,但公平地说,这种学习曲线为另一种方法创造了机会。
XQuery 满足了日益壮大的用户群体对替代方案的需求:他们发现 XQuery 的学习曲线更低,它满足了他们对转换 XML 的需求,并且与 XQuery 的其他优势一起,它已成为一种引人注目的“一体化”语言。与 XSLT 一样,XQuery 由 W3C 创建来处理 XML。但与使用 XML 语法表达语言不同的是,XQuery 的架构师选择了一种对服务器端脚本语言(如 PHP、Perl 或 Python)用户更熟悉的语法。XQuery 的设计与关系数据库查询语言(如 SQL)的用户类似,同时仍然忠实于函数式编程实践。尽管 XQuery 相对年轻(XQuery 1.0 仅在 2007 年发布,而 XSLT 已经发布了 2.0 版),但 XQuery 的诞生非常成熟。eXist-db 和 MarkLogic 等 XML 服务器已经在使用 XQuery 作为其查询 XML 和执行 Web 服务器操作的语言(从而避免了学习 PHP、Perl 或 Python 的必要性)。
因此,面对 XSLT 社区声称“XSLT 最适合转换文档,而 XQuery 最适合查询数据库”,这个用户群体惊讶地发现,XQuery 完全取代了他们对 XSLT 的需求。他们开始毫不掩饰地声称他们更喜欢 XQuery 用作此目的。
XQuery 如何完成转换 XML 的任务?XQuery 中用于转换 XML 的主要技术是 XQuery 作者添加的一个鲜为人知的表达式,称为“类型切换”。虽然它非常简单,但类型切换使 XQuery 能够执行 XSLT 所执行的几乎所有转换。类型切换表达式会快速查看节点的类型,并根据节点的类型,执行您为该类型节点指定的运算。这意味着文档的每个不同元素都可以有自己的规则,这些规则可以存储在模块化的 XQuery 函数中。对 XQuery 语言的这一简朴添加使开发人员能够转换具有复杂内容和不可预测顺序的文档 - 这通常被认为是 XSLT 的最佳领域。尽管语法和转换方法存在差异,但日益壮大的用户群体实际上已经开始将 XQuery 类型切换表达式视为一种有效甚至更优越的方式来存储他们的文档转换逻辑。
通过围绕类型切换表达式构建一组 XQuery 函数,您可以实现与 XSLT 风格转换相同的结果,同时保留 XQuery 的优势:易于学习并与原生 XML 数据库集成。对于那些使用原生 XML 数据库的用户来说,类型切换的存在意味着他们只需要学习一种语言来执行他们的数据库查询、Web 服务器操作和文档转换。这些 XQuery 类型切换例程已被证明易于构建、测试和维护 - 有些人认为比 XSLT 更容易。XQuery 类型切换为这些用户提供了高度的灵活性,使他们能够完全掌握 XQuery,而不是将时间和精力分配到 XQuery 和 XSLT 之间。
也就是说,仍然存在大量运作良好的遗留 XSLT 转换,并且有一些 XSLT 开发人员认为迁移到类型切换风格的 XQuery 并没有什么益处。两种方法都是有效的文档转换方法。XQuery 类型切换和 XSLT 的支持者之间产生了自然的张力,他们分别推广着自己最熟悉和认为更优越的方法。在实践中,您可能最适合尝试这两种技术,并确定哪种风格适合您和您的组织。在没有假设您具备 XSLT 背景或兴趣的情况下,本文及其配套文章将帮助您了解使用 XQuery 类型切换满足您的 XML 转换需求的关键模式。