我正在研究使用 Microsoft 的替代方案XslCompiledTransform
,一切似乎主要指向 Saxon,其次是 XQSharp。当我开始查看 Saxon 的文档时,我发现 XQuery 可以做与我的 XSLT 相当的工作,而 XSLT 远没有 XQuery 的标记那么简洁。
XSLT 与 XQuery 相比有哪些优势值得拥有更详细的语法?
会是可以创建的模板功能吗?
一般来说,有很多重叠。两者都植根于底层 XPath 实现。至于是使用 XSLT 还是 XQuery,证据就在布丁中:XSLT 更擅长转换,而 XQuery 更擅长查询。
因此,将 XQuery 用于:
相反,将 XSLT 用于:
XSLT 旨在获取一个xml 文档并将其转换为其他内容,例如 csv、html 或不同的 xml 格式,例如 xhtml。
XQuery 旨在从一个或多个xml 文档中提取信息,并将结果组合到一个新的 xml 文档中。
XQuery 和 XSLT 都严重依赖 XPath。如果您的输出基于一个输入 xml 文档和 **一个输出 xml 文档,则两者几乎可以互换。
XQuery 的 FLWR 语法非常直观,如果您有 SQL 背景,IMO XSLT 在处理单输入/单输出情况时是更强大的语言,尤其是在输出不是 xml 的情况下。
就我个人而言,我发现基于 xml 的语法和 XSLT 的声明性质有点难以阅读和维护。
这真的归结为选择,尽管使用 XQuery 进行“简单”格式化有点不寻常。如果您的输入基于多个 xml 文档,那么您几乎会被 XQuery 卡住,如果您的输出不是基于 xml,那么您几乎会被 XSLT 卡住。
离开的最大原因XslCompiledTransform
是它仅仅是一个 XSLT 1.0 处理器。
XSLT 2.0 和 XQuery 1.0 的大部分功能重叠,并且在大多数情况下,它们是具有不同语法的相似语言(有点像 C# 和 VB)。
XSLT 更加冗长,但它的模板特性添加了许多功能,在 XQuery 中复制这些功能可能相当麻烦,尤其是对节点树进行小的更改。XQuery 中特别麻烦的主要特性是<xsl:template match="..." />
和<xsl:copy>...</xsl:copy>
.
只要不需要模板功能,XQuery 就具有更简洁的语法 (IMHO),而且我发现它对于更高级的计算和从大型文档中检索数据要好得多。
XQuery 通常被视为一种数据库语言。虽然很多数据库都以这种方式使用它,但它并不是唯一的用途。数据库中语言的一些实现非常受限。另一位评论者声称 XQuery 是“非常强类型的”。除非您使用静态类型特性,否则 XQuery 的类型并不比 XSLT 强。虽然一些数据库实现强制您使用静态类型功能,但大多数其他实现正在远离这一点。
他还声称 XQuery 对于“更大、更复杂的事情”不是很好。我会提出完全相反的观点。语法的简洁性和风格使得在 XQuery 中编写复杂的函数和计算变得更加容易。我用 XQuery 写了一个光线追踪器,感觉真的很自然;我认为在 XSLT 中编写这种计算复杂的东西会更难(当然更冗长)。
总之:
XSLT 更适合转换。如果您有一个结构大致正确的文档,并且您想要转换组件,例如呈现 XML 文件的 HTML 版本,那就更好了。
XQuery 更自然地用于从各种来源构建新的 XML 文档,或者用于更改文档的结构。
请注意,重叠相当大,并且通常没有“正确”的选择,但如果您做出错误的选择,那么您往往会发现自己的工作与谷物背道而驰。
XSLT 和 XQuery 做两件不同的事情。顾名思义,XSLT 用于将数据从一种形式转换为另一种形式(例如,从 XML 到 HTML)。另一方面,XQuery 是一种用于从 XML 文档中查找和提取某些 XML 节点的语言,然后可以将其用于多种目的。
XSLT 实际上依赖于 XQuery 的功能,请查看www.w3schools.com上的教程;如果使用得当,它们都是非常强大的技术。