import xmlpl.xml;
import xmlpl.curl;
:: Forward Declaration
node[] evaluate(element e, integer depth, integer &index, string label);
node[] doChildren(element e, integer depth, integer &index, string label) {
foreach (e/node())
if (Element(.)) evaluate(Element(.), depth, index, label);
else .; :: If it's not an element just copy it.
}
node[] doContents(element e) {
foreach (e/section) -
value(@title);
if (./section) doContents(.);
}
node[] doSection(element e, integer depth, integer &index, string label) {
integer subindex = 1;
string newlabel = label + index + ".";
<("h" + (depth + 1))>
newlabel;
" ";
value(e/@title);
>
doChildren(e, depth + 1, subindex, newlabel);
index++;
}
node[] evaluate(element e, integer depth, integer &index, string label) {
switch (name(e)) {
:: Process contents starting from the parent element
case "contents": doContents(e/..); break;
case "section": doSection(e, depth, index, label); break;
default:
:: Copy the element
<(name(e))>
e/@*; :: Copy attributes
doChildren(e, depth, index, label);
>
}
}
node[] main(document in) {
integer index = 1;
value(in/webdoc/@title);
value(in/webdoc/@title);
foreach (in/webdoc/*)
evaluate(., 1, index, "");
}