具有 xml 输入和 xpath 表达式的 TemplateEngine

TemplateEngine with xml input and xpath expressions

坦率地说,我正在寻找一个离线模板引擎,以使用 xpath 语法将 xml 数据库中的信息应用到特殊的文本文件中。

我的文字不太好,举个例子更容易明确。所以我的 db.xml 看起来像:

<root>
    <what name="pete" />
</root>

file.tmpl 看起来像(语法组成):

This is a scratch-file.
<!--(for n in '/root/what/@name')-->
   whats name is @!n!@
<!--(else)-->
   no whats...
<!--(end)-->

所以在调用./tool -x db.xml -t file.tmpl > file之后file的结果内容应该是:

This is a scratch-file
   whats name is pete

当然,我希望在 xpath returns 变量上下文 @!!@ 中的非字符串时出现异常,等等。我正在寻找数据和模型安全性,而不是性能或便利性。

我知道:最后这看起来很像简化的 xslt 包裹在一个很好的人类可读的语法中;-)

我没有找到实现此功能的模板引擎工具。我所研究的全部使用 yaml/json 作为数据输入,例如 mustache、django、pyratemp... 或者不提供像 django-xml.

这样的良好外部接口

我可以开始自己动手,但这感觉毫无意义,已经有这么多模板引擎了!有任何指示或输入吗?

确实有许多可用的模板语言可以满足您的需求,但是SO policy does not allow asking for tools or libraries因为这通常会征求自以为是的答案。

I know: In the end this looks a lot like simplified xslt wrapped into a nice human-readable syntax ;-)

我个人认为 XSLT 非常适合人类阅读,因为它使用 XML,它本身就是为了人类可读而设计的。当然,这只是见仁见智。

就是说,我认为使用 XML 语言组(XQuery、XSLT、XProc、XPath 等)中的现有工具,您应该能够轻松取得长足进步。例如:

  • XSLT 3.0 (a list of XSLT 3.0 processors can be found on the XSLT info page) 允许您编写文本值模板,它是嵌入文本节点的语法,只需使用大括号即可。以您的示例输入:

    <xsl:template match="/" expand-text="yes">
        This is a scratch-file.
        {for $n in /root/what/@name
           return 'whats name is ' || $n}
        {if(not(/root/what/@name)) then 'no whats' else ()}
    </xsl:template>
    

    或(也为 XSLT 3.0):

    <xsl:template match="/" expand-text="yes">
        This is a scratch-file.
        <xsl:sequence>
            <xsl:for-each select="/root/what/@name">whats name is {$n}</xsl:for-each>
            <xsl:on-empty>no whats</xsl:on-empty>
        </xsl:sequence>
    </xsl:template>
    
  • 此外,对于 XSLT 3.0,您可以将示例输入与 xsl:evaluate 一起使用,以自动计算模板中的 XPath。这将不需要您的用户理解(部分)XSLT,并允许您在模板中完全自由。但是,您应该定义一种明确的方式来从其余部分中标记化您的 XPath(在您的示例中,使用注释是一种可行的方法,因为您可以简单地通过 comment() 个节点进行标记化)。

  • 在 XQuery 3.1 中,但这是新闻界的热点,您将拥有字符串模板,它比 XSLT 走得更远。使用 XQuery 的另一个优点是它可以更自然地连接到现有的 XML 数据库。查看导致它的 this thread for the modified propoposal 和 following/preceding 消息。
  • 使用 XProc,您可以预处理模板,自动生成 XSLT,并将此 XSLT 作为处理实际输出的主要样式表。使用新的 xsl:initial-template,设计入口点变得微不足道,您可以参数化来自数据库的输入。