xsl-list
[Top] [All Lists]

RE: key() in match pattern of xsl:key

2005-12-10 08:52:13

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>
--~--