                  ********
                 *        *
                 *  TODO  *
                 *        *
                  ********

Lifetime of result Value Tree, make sure we keep pointers. Exslt
handling of node set values is especially nasty in this respect,
lots of potential mem leaks...

Pattern tester:
  -> try to optimize for ID scan and tests.

Pattern scanner:
  -> add error checks on all returns

Sorting:
  -> add lang and case-order
  -> add foreign sorting functions (interfaces ?).

                  ********
                 *        *
                 *  DONE  *
                 *        *
                  ********

Design:
  - should transforms for a given stylesheet be thread clean,
    -> the precompilation now occur only at stylesheet processing
       time (except the binding for named templates and extension
       functions which need to be computed once at run-time).
       Multiple threads should be able to reuse the same stylesheet
       now.

Embedding Stylesheets:
  - example in 2.7 would force to validate, we do it by default now

ID and Key support:
  -> Done

Extra functions:
  -> document() should not be a problem since Result Tree Fragments are
     implemented
  => Done

Templates:
  -> check the built-in template rule for attributes
  -> make sure @xxx matches are applied

Contextual error reporting:
  -> provide a couple of functions providing context analysis, not urgent

Validity:
  -> should we add validation by default ? Make this an option
  -> redirrect validity errors
  => done added a special parsing mode

Import:
  -> parse them
  -> provide functions to circulate in the import tree of stylesheets
  -> make sure we use the cascade wherever it's needed

Extra functions:
  -> make a separate module.
  => done functions.[ch]

Support Attribute value templates:
  -> starts to be urgent. Design it in flexible ways but try to optimize
     to handle most of it at the stylesheet parse time ...
  => Done for the most part need to check all attributes in XSLT constructs
     using them and use the dedicated readin function.
  -> optimization by checking their existence at stylesheet parse time.
  => done when building the preproc function

Sorting:
  -> add support for imbricated sorts
  => done but not well tested.

Separate util module:
  -> macros, config, verbosity ?
  => xsltutils.[ch]

Support for disable-output-escaping="yes":
  -> looks problematic, libxml has no support for anything like this,
     and unless adding a new node type :-( or tweaking text node and
     output routines this is gonna be messy ... must be handled at libxml
     level.
  => Done with a trick, text node name is different, requires > 2.2.11

Pattern scanner:
  -> compute priority
  -> handle unions
  -> support for mode
  => done

Pattern tester:
  -> also put fast lookup for "text()", "comment()", "node()"
     based patterns lists.
  => done

Support Attribute value templates:
  -> namespace support for attribute value templates is not done, need
     a small API redesign

Doc:
  - put a page at http://xmlsoft.org/XSLT/
  - generate/transform the DocBook to HTML
  - add HTML to package
  - manpage and doc for xsltproc


Error handling:
  -> check the version stuff, design a separate module for error interfacing
     and default handling, parsing vs. runtime, fatal / compat / warning,
     and lack of optionnal features.
  -> reports context

ID and Key support:
  -> done but namespace support in keys is not defined
  -> make sure keys are recomputed on new document input

Profiler:
  -> added looks good enough
  -> autocorrection of initial calibration loop
