Should it be possible to reference one key in the match pattern of
another?
Yes, there's no ban on it, in either XSLT 1.0 or 2.0. But I haven't seen it
done very often.
That
is, among the keys, is it `declaration before use' or `use before
declaration'? Or either way?
No, there's no ban on forwards or backwards references. XSLT 2.0 makes it
explicit that circular references among keys must be detected and reported
as a dynamic error; in XSLT 1.0 this situation is left to the implementor,
and could possibly result in an infinite loop.
I find that this technique makes computing set differences
(and surely
there are other applications) readable, efficient, and scalable. For
example, given:
<xsl:key name="keyB" match="B" use="." />
The variable AnotB stores the final set I'm after:
<xsl:variable name="AnotB" select="//A[ not( key( 'keyB', .
) ) ]" />
Nice idea. However we need to be clear that we're talking here about sets
based on node values, not node identity. Though the same approach could be
used for sets based on identity by using generate-id() as the "use"
expression.
I have tested this computation with libxslt 1.1.15. Although Daniel
Veillard has informed me that this usage is currently outside
the realm of
specified functionality, the above does work for my simple
test cases.
The spec doesn't define any restrictions in this area, so implementations
are not allowed to impose any restrictions.
Michael Kay
http://www.saxonica.com/
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--