具有 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
,设计入口点变得微不足道,您可以参数化来自数据库的输入。
坦率地说,我正在寻找一个离线模板引擎,以使用 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
,设计入口点变得微不足道,您可以参数化来自数据库的输入。