明确地说,我正在寻找一个离线模板引擎,使用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这样漂亮的外部接口。
我可以开始自己动手了,但这感觉毫无意义,已经有很多模板引擎了!是否有任何指针或输入?
答案 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()
节点进行标记)。
xsl:initial-template
,设计入口点变得微不足道,您可以参数化数据库中的输入。