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)
  1. 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, ""); }