查看源代码 xmerl_xs (xmerl v2.1)
类似 XSLT 的 XML 文档转换。
Erlang 与 XSLT 有相似之处,因为两种语言都采用了函数式编程方法。使用 xmerl_xpath
可以在 Erlang 中编写类似 XSLT 的转换。
XSLT 样式表通常用于将 XML 文档转换为其他 XML 文档或用于呈现的 (X)HTML。XSLT 包含相当多的函数,学习它们可能需要一些努力。本文档假定您对 XSLT 有基本的了解。
由于 XSLT 基于具有模式匹配和递归的函数式编程方法,因此可以在 Erlang 中编写类似的样式表。至少对于基本转换来说是这样。本文档描述如何将 XPath 实现与 Erlang 的模式匹配和几个函数结合使用来编写类似 XSLT 的转换。
这种方法对于 Erlang 程序员来说可能更容易,但是如果您需要使用真正的 XSLT 样式表以“符合标准”,则有一个适配器可用于 Sablotron XSLT 包,该包是用 C++ 编写的。另请参阅 类似 XSLT 的转换教程。
摘要
函数
-spec built_in_rules(Fun, E :: xmerl:element()) -> io_lib:chars() when Fun :: fun((xmerl:element()) -> io_lib:chars()).
默认的回退行为。
模板函数应以:template(E) -> built_in_rules(fun template/1, E)
结尾。
-spec select(String :: term(), E :: xmerl:element()) -> _.
根据 XPath 从 XML 树中提取节点。
等效于 xmerl_xpath:string(Str, E)
。
另请参阅: value_of/1
。
-spec value_of(E :: xmerl:element()) -> io_lib:chars().
连接树内的所有文本节点。
示例
<xsl:template match="title">
<div align="center">
<h1><xsl:value-of select="." /></h1>
</div>
</xsl:template>
变为
template(E = #xmlElement{name='title'}) ->
["<div align="center"><h1>",
value_of(select(".", E)), "</h1></div>"]
-spec xslapply(Fun, ElementList) -> io_lib:chars() when Fun :: fun((xmerl:element()) -> io_lib:chars()), ElementList :: [xmerl:element()] | xmerl:element().
类似于 xsl:apply-templates。
一个包装器,使事物看起来类似于 xsl:apply-templates。
示例,原始 XSLT
<xsl:template match="doc/title">
<h1>
<xsl:apply-templates/>
</h1>
</xsl:template>
在 Erlang 中变为
template(E = #xmlElement{ parents=[{'doc',_}|_], name='title'}) ->
["<h1>",
xslapply(fun template/1, E),
"</h1>"];