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

时间:2015-10-16 13:26:39

标签: xml xpath template-engine

明确地说,我正在寻找一个离线模板引擎,使用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在变量上下文@!!@中返回非字符串时,我希望有例外,依此类推。我正在寻找数据和模型的安全性,而不是性能或便利性。

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

我没有找到满足此功能的模板引擎工具。所有我研究使用yaml / json作为数据输入,如mustache,django,pyratemp ...或者不提供像django-xml这样漂亮的外部接口。

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

1 个答案:

答案 0 :(得分:1)

确实有很多可用的模板语言可以满足您的需求,但SO policy does not allow asking for tools or libraries通常会征求自己的意见。

  

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

我个人认为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以及之前/之前的消息。
  • 使用XProc,您可以预处理模板,自动生成XSLT,并将此XSLT作为处理实际输出的主样式表。使用新的xsl:initial-template,设计入口点变得微不足道,您可以参数化数据库中的输入。