-module(xserl_test).
-include("xmerl.hrl").
-import(xserl,[ xslapply/2, value_of/1, select/2, built_in_rules/2 ]).
-export([process_xml/1,test/0]).
doctype()->
"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\
\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd \">".
test() ->
Str= "<?xml version=\"1.0\"?>"
"<doc xmlns='urn:loc.gov:books' xmlns:isbn='urn:ISBN:0-395-36341-6'>"
"<title>Cheaper by the Dozen</title>"
"<isbn:number>1568491379</isbn:number>"
"<note>"
"<!-- make HTML the default namespace for some commentary -->"
"<p xmlns='urn:w3-org-ns:HTML'>"
"This is a <i>funny</i> book!"
"</p>"
"</note>"
"</doc>",
{Doc,_}=xmerl_scan:string(Str,[{fetch_fun, fun(DTDSpec,S) -> {ok,S} end}]),
process_xml(Doc).
process_xml(Doc)->
template(Doc).
template(E = #xmlElement{name='doc'})->
[ "<\?xml version=\"1.0\" encoding=\"iso-8859-1\"\?>",
doctype(),
"<html xmlns=\"http://www.w3.org/1999/xhtml\" >"
"<head>"
"<title>", xserl:value_of(select("title",E)), "</title>"
"</head>"
"<body>",
xslapply( fun template/1, E),
"</body>"
"</html>" ];
template(E = #xmlElement{ parents=[{'doc',_}|_], name='title'}) ->
["<h1>",
%% xslapply( fun template/1, E),
%% same as
lists:map( fun template/1, E#xmlElement.content ),
"</h1>"];
template(E = #xmlElement{ parents=[{'chapter',_}|_], name='title'}) ->
["<h2>",
xslapply( fun template/1, E),
"</h2>"];
template(E = #xmlElement{ parents=[{'section',_}|_], name='title'}) ->
["<h3>",
xslapply( fun template/1, E),
"</h3>"];
template(E = #xmlElement{ name='para'}) ->
["<p>",
xslapply( fun template/1, E),
"</p>"];
template(E = #xmlElement{ name='note'}) ->
["<p class=\"note\">"
"<b>NOTE: </b>",
xslapply( fun template/1, E),
"</p>"];
template(E = #xmlElement{ name='emph'}) ->
["<em>",
xslapply( fun template/1, E),
"</em>"];
template(E)->
built_in_rules( fun template/1, E).
%% It is important to end with a call to xserl:built_in_rules/2
%% if you want any text to be written in "push" transforms.
%% That are the ones using a lot xslapply( fun template/1, E )
%% instead of value_of(select("xpath",E)), which is pull...
%% Could maybe be caught as an exception in xslapply instead,
%% but I think that could degrade performance - having an
%% exception for every #xmlText element.