XSLT在其他语言中的两个概念:应用模板和xpath

XSLT在其他语言中的两个概念:应用模板和xpath,xslt,xpath,templating,apply-templates,Xslt,Xpath,Templating,Apply Templates,背景:放弃了XSLT作为编程工具包的一部分的实际日常使用,我想知道在其他语言中是否有实现该工具(只有)两件我错过的事情: 通过xpath使用“路径”样式的语句遍历数据结构的能力 使用应用模板而不是通过迭代或“循环”方法遍历模板转换的能力 据谷歌称,有几项工作正在努力为Javascript添加“xpath风格”支持,但这些工作显然还没有流行起来。到目前为止,我还没有发现有人在另一种语言中使用“应用模板”方法 问题:是否有人知道有一种编程语言(希望是主流的)从XSLT中窃取了这两个好主意,或者使

背景:放弃了XSLT作为编程工具包的一部分的实际日常使用,我想知道在其他语言中是否有实现该工具(只有)两件我错过的事情:

  • 通过xpath使用“路径”样式的语句遍历数据结构的能力
  • 使用应用模板而不是通过迭代或“循环”方法遍历模板转换的能力
据谷歌称,有几项工作正在努力为Javascript添加“xpath风格”支持,但这些工作显然还没有流行起来。到目前为止,我还没有发现有人在另一种语言中使用“应用模板”方法


问题:是否有人知道有一种编程语言(希望是主流的)从XSLT中窃取了这两个好主意,或者使用不同的方法应用相同或类似的概念?

XPath虽然对XSLT的工作至关重要,但与之无关;像libxml这样的库免费提供给您。您描述的模板应用程序的样式有点复杂;这就是通常使用XSLT的目的

任何这样做的编程语言都应该是函数式的。您可以尝试编写自己的、不太冗长的XSLT方言;Perl还可能为您提供足够的绳索,使您能够令人信服地模拟此功能(尽管性能影响尚不清楚)

然而,困难的答案是,除了作为现有语言的库之外,它实际上并不存在

通过xpath使用“路径”样式的语句遍历数据结构的能力

我不知道还有哪种语言嵌入了XPath,但LINQ到XML有点类似,特别是在它的化身中。但是,您可以在通用Lisp宏或D模板中实现它

使用应用模板而不是通过迭代或“循环”方法遍历模板转换的能力

没有我知道的主流语言。事实上,这一特性可能是使用XSLT的主要原因(而不是像XQuery那样,查看密切相关的语言)


它可以在任意条件下有效地扩展接收器上的动态分派-因此,我认为您可能可以在Common Lisp(具体来说是CLOS)中执行此操作-如果我没记错的话,它的多方法可以匹配任意条件,因此如果您有一个XPath模式计算器,您可以使用它来模拟
应用模板
,更重要的是,因为
apply templates
只对单个参数进行分派,而CLOS multi-methods则对多个参数进行分派。

对于XPath,这是肯定的。对于C,有,对于Java(有多个实现),C#有和。如果要将XPath用于对象层次结构,请参阅


对于模板转换,如果尚未使用C#,则应查看C。这不完全是一回事,但它允许在不显式循环的情况下处理对象。

我没有发现类似的情况。但是为什么会有人使用其他任何东西来转换XML呢?一旦您了解了开发解决方案的非过程性方法,XSLT就做得非常好。我们的应用程序主要基于XSLT,它是一个非常强大的工具

关于您的第一个要求的评论:

  • 通过xpath使用“路径”样式的语句遍历数据结构的能力
XPath对数据结构做了很多假设。如果要使用它,最好将结构转换为XML,因为一旦通过类似XPath的语言使其可遍历,它就会看起来像XML,除非严格限制XPath子集

另外,请记住,您缺少的“只有两件事”,即XPath和模板处理,实际上是构成Xslt的重要部分。我很好奇你为什么决定把它从工具带上拿下来


尽管您需要Xslt替代品,但我仍然特别推荐Xslt和XSLT2.0。通过添加和,您就拥有了一种强大的文本处理语言。例如,看一看样式表。即使JSON不是常规的,您仍然可以使用递归模板编写一个简单的JSON到XML转换器,并随意转换结果

其目的不是转换XML,而是使用XSLT2.0中的任何通用编程语言(而不是XSLT等非通用语言)转换任意数据结构(如JSON)。有多种新功能使解析JSON等非XML文件变得更容易(如unparsed-text(),正则表达式等)。与其寻找XSLT的替代方案,不如看看您是否可以使用XSLT 2.0实现所需。根据规范,XSLT不是一种通用编程语言(例如,您不能在JSON上进行XSLT转换),因此即使XSLT非常适合我,因为XML不是我唯一的数据格式,所以它的使用仍然是有限的。您已经谈到了一个问题,将每个结构转换为XML数据包有一些相当麻烦的方面。此外,XSLT的功能非常强大,但对于一种纯粹的通用转换语言来说,有一些东西值得一提。现在还不清楚XSLT2.0是否就是这样。如果是这样的话,结果还有待观察。我敢肯定,大多数人都会同意XSLT不是通用的。然而,我很好奇,在伪代码中是否考虑了特定的用例。如果有通用的东西,您将如何定义它的结构以及如何将它遍历到转换器?我猜想,该定义将非常繁琐,足以证明将数据结构转换为XML是正确的。但是,如果您想到一个相当优雅的语法,那么对于一个项目来说,这将是一个好主意