xsl-list
[Top] [All Lists]

RE: [xsl] GROUPING AND KEYS

2009-04-28 06:42:28
It's worth being clear that we're talking here about the Muenchian method of
grouping in XSLT 1.0. Grouping in XSLT 2.0 is much much simpler. 

1 - Is there a way to visualise in XSLT what this key looks like?

<xsl:key name="partNo" match="partNo" use="@num" />

You can think of it like this: "Each document that contains partNo elements
has an index, allowing a partNo element to be found quickly if the value of
its @num attribute is known". For example, key('partNo', 'P123') returns all
the partNo elements whose @num value is P123.


In this statement <xsl:for-each 
select="foo/shift/partNo[count(. | key('partNo', @num)[1]) = 1]">

In XSLT 1.0, there is no simple way of asking "$A is $B", that is, testing
whether two expressions refer to the same node. There are two common
workarounds to this:

generate-id($A) = generate-id($B)

which relies on the fact that if two nodes have the same generated ID then
they are the same node, and

count($A|$B) = 1

which relies on the fact that the union of two singleton sets is a singleton
only if both sets have the same member. In your example, this is the
expression you are seeing.

Specifically, it's selecting every partNo that is the first partNo with a
given @num value. That is "." (the partNo being tested) is the same node as
key('partNo', @num)[1], which is the first partNo with that @num value.

we are selecting all partNo nodes where count(. | key( 
'partNo', @num)[1]) = 1]

2 - What does . mean in this expression? the partNo node?

Yes, in a predicate "." refers to the node being tested. 

3 - What does | mean? 

It's a union operator, it forms the union of two sets.

Hope this helps.

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

<Prev in Thread] Current Thread [Next in Thread>