XSLT like transforms in Erlang using xmerl
Mikael Karlsson
mikael.karlsson@REDACTED
Thu Jan 30 11:41:35 CET 2003
Morning,
looks great, I hope this is something thats targeted for your next version
of STL? I think I will need a coup of coffe or so before I dive into your
code details though :-)
Now this assumes that you have a source formatted in EHTML,
meaning you need a parser if your source is XML or that you
already are in "Yaws space" , doesn't it ?
My reason to use xmerl is:
1. I can read (parse) an ordinary XML document.
2. the xpath implementation in xmerl combined with pattern matching in Erlang
makes it quite easy to write "stylesheets" that look very similar to XSLT
sheets. It is rather straighforward to grab an XSLT sheet and rewrite it as
an Erlang sheet.
The select(Str,E) function below is just a call to
xmerl_xpath:string(Str,E). Xpath is a quite substantial part of XSLT.
ex:
<xsl:template match="title">
<div align="center"><h1><xsl:value-of select="." /></h1></div>
</xsl:template>
becomes:
template(E = #xmlElement{name='title'}) ->
["<div align=\"center\"><h1>", value_of(select(".", E)), "</h1></div>"];
and:
<xsl:template match="doc/title">
<h1>
<xsl:apply-templates/>
</h1>
</xsl:template>
becomes:
template(E = #xmlElement{ parents=[{'doc',_}|_], name='title'}) ->
["<h1>",
xslapply( fun template/1, E),
"</h1>"];
Easy, peasy :-)
3. You can export directly to XML (and other formats), so you do not
need Yaws. This might happen.
My request was if this would add value to the xmerl application, I hope it
does. If Yaws and other apps would benefit as well, so much better.
Thanks
Mikael
Thursday 30 Jan 2003 Vladimir Sekissov wrote:
> Good day,
>
> Yaws has simple and excellent idea of EHTML. Here are my two cents.
> XSLT like transforms in Erlang without xmerl.
>
> Example in source (exmlt:test/0) transforms
>
> {user, [],
> [{first_name, [], "Tom"},
> {last_name, [], "Jones"}
> ]}
>
> to
>
> {form,[{action,"adduser"}],
> [{table,[],
> [{tr,[{class,"rowset0"}],
> [{td,[],"first_name"},
>
> {td,[],[{input,[{name,"first_name"},{value,"Tom"}]}]}]},
> {tr,[{class,"rowset1"}],
> [{td,[],"last_name"},
>
> {td,[],[{input,[{name,"last_name"},{value,"Jones"}]}]}]}|
> {tr,[{colspan,"2"}],
> [{td,[],[{input,[{type,"submit"},{name,"save"}]}]}]}]}]}
>
> Best Regards,
> Vladimir Sekissov
>
> ------------------------------ cut here ---------------------------
..
More information about the erlang-questions
mailing list