
        NOTES relative to the implementation
	====================================

xsl:stylesheet:

  all children except xsl:import can be in any order, so this
can be stored as one big structure.

xsl:include:
  
  this is really similar to XInclude, can be implemented as a
nearly separate processing just after the XML stylesheet has been
parsed.
  Detect loops using a limited stack ...

xsl:import:

  seems this should be really implemented as having a stylesheet
sublist being itself an import list

  add the list at the end
  when doing a resolution explore child before siblings in the list

3 Data Model, we should operate on parsed trees

3.1 No problem

3.2 use the XML Base call, XSLT-1.1 references it

3.4 Whitespace Stripping

  Seems one may have to do a bit of preprocessing on both the
stylesheet trees and the source trees.

4 Expressions

  looks okay, wondering about variable bindings though...
  default namespace not in scope

5.1 Processing Model

  look in Michael Kay's book about how to efficiently find the
template applying to a node. Might influence the in-memory stylesheet
representation

5.2 Patterns

  the end of that section suggest that the expression could be computed in
a simpler way. Maybe templates needs to be evaluated differently than
through the normal XPath processing. This can be implemented separately
or build an expression tree in the XPath module and use a different 
evaluation mechanism. Not sure this is best.

5.4 Applying Template Rules

  xsl:apply-templates is the recurstion mechanism, note the select
mechanism.

  detection of loop: once the applied nodeset has been computed,
check that none of the elements is part of the existing set in use, this
may be costly and should be triggered only at a certain depth.

5.5 Conflict Resolution for Template Rules

  Sounds again that evaluation of a pattern rule should provide one
more information not provided by the standard XPath evaluation

5.6 Overriding Template Rules

  another recursion mechanism, confirm that it is needed to separate
the imported stylesheets.

5.7 Modes

  Confusing ??? need an example.

6 Named Templates

  No big deal it seems

7.1.1 Literal Result Elements

  cleanup of the namespace template should be done initially at stylesheet
parsing.

7.1.2 Creating Elements with xsl:element

   okay, I bet it's usually used with { } expression computations

7.1.3 Creating Attributes with xsl:attribute

   need some running code to better understand all the subtilties

7.1.4 Named Attribute Sets

   Okay just a way to mimick param entities use fo attrib groups in Dtd's

7.2 Creating Text

   adjacent text nodes are merged ... okay
   output escapeing might need a libxml API extension

7.3 Creating Processing Instructions
7.4 Creating Comments

   RAS, one just need to make a couple of trivial checks

7.5 Copying

   Okay will need some testing

7.6.1 Generating Text with xsl:value-of

   will be a good test for XPath string() function
   note in the example that the text nodes are coalesced

7.6.2 Attribute Value Templates

   hum, this is 
    - contextual
    - uses XPath

  best seems to parse, generate an evaluation tree then evaluate
when accessed. Note that multipe expressions can be associated to 
a single attribute. Sounds like i will have to introduce a new
element type inserted in the attribute nodelist. dohh ...

7.7 Numbering

  sounds interesting for users but might be costly, we will see ...

7.7.1 Number to String Conversion Attributes

   format="..." :-( it's gonna be painful ...

8 Repetition
9 Conditional Processing

  doesn't sounds hard to implement since we are at an interpreter
level but really useful in practice. Will be simple once the overall
framework is set-up.

10 Sorting

  Okay applied to the node list of an xsl:apply-templates or xsl:for-each

  The NOTEs are a bit scary ...

11 Variables and Parameters

   Variables can only be afttected at the top level, so it
seems they act only as global variables ...
   But this is by regions .... so some of the statements within
a stylesheet my use a different set than others ... in practice
it turns to be nearly like loacal variables ....
  Need more thinking on this to handle it properly.
  Might explain on of TOM's requests w.r.t. variable resolution

11.1 Result Tree Fragments

  Dohhh a new type ...
  actually it's just a node set restricted type

11.2 Values of Variables and Parameters

  okay, real problem is scoping ...

11.3 Using Values of Variables and Parameters with xsl:copy-of 

  No surprize

11.4 Top-level Variables and Parameters

   It is an error if a stylesheet contains more than one binding
   of a top-level variable with the same name and same import precedence

   => ah ah, so it seems one can associate the variable bindings
to a stylesheet and if needed recurse down the import list if not
found, would simplify things a lot !

   If the template or expression specifying the value of a global variable
x references a global variable y, then the value for y must be computed
before the value of x.

   => Values can probably be computed dynamically at reference
time, if this generate a loop, then it's an error. Lazy computations
are great ...

11.5 Variables and Parameters within Templates

   
   xsl:variable is allowed anywhere within a template that an instruction
is allowed. In this case, the binding is visible for all following siblings
and their descendants.
   It is an error if a binding established by an xsl:variable or xsl:param
element within a template shadows another binding established by an
xsl:variable or xsl:param element also within the template.

  => the example seems to imply that we can simply keep a list of
     local variable binding to a template ... sounds fine.

11.6 Passing Parameters to Templates

  => Okay the parameter overrides the local binding

12.1 Multiple Source Documents
12.2 Keys

  skipped for now

12.3 Number Formatting

  reimplementing Java formatting in C is gonna be a pain !

12.4 Miscellaneous Additional Functions

  current() => trivial

  unparsed-entity-uri() => support in uri.c should do

  generate-id() => use the in-memory address of the node ???

  system-property() => sounds simple

13 Messages

  trivial I/Os

14 Extensions
15 Fallback

   skipped for now

16 Output

16.1 XML Output Method

  sounds that calling directly libxml output on the result tree
should do it with a few caveats, for example one need to be
able to parametrize the output

16.2 HTML Output Method

  sounds that calling libxml HTML output should do it too

16.3 Text Output Method

  doesn't sounds too hard ...

16.4 Disabling Output Escaping

  hum ... might be a bit painful to implement with the current framework.
