This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: Getting equivalence classes on attributes
- To: xsl-list at lists dot mulberrytech dot com
- Subject: Re: [xsl] Getting equivalence classes on attributes
- From: Francis Norton <francis at redrice dot com>
- Date: Mon, 18 Jun 2001 07:00:38 +0100
- References: <Pine.LNX.4.33.0106181211120.1120-100000@dido.engr.internet.org.ph>
- Reply-To: xsl-list at lists dot mulberrytech dot com
"Rafael R. Sevilla" wrote:
>
> Hello. Is there a way to write an XPath expression that will return each
> equivalence class on the value of an attribute, i.e. every collection of
> nodes whose value for a certain attribute are the same e.g.
>
See http://www.jenitennison.com/xslt/grouping/muenchian.html for the
general method of grouping elements by some XPath key expression. You
would want to group attributes with something like:
<xsl:key name="attributes-by-name-and-value" match="@*"
use="concat(name(), '=', ." />
with, instead of a xsl:value-of, something like:
<xsl:copy-of select=".." />
In other words,
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:key name="all-attributes" match="@*" use="concat(name(), '=',
.)"/>
<xsl:template match="/">
<groups>
<xsl:for-each select="//@*[generate-id() =
generate-id(key('all-attributes', concat(name(), '=', .))[1]) ]">
<xsl:sort select="name()"/>
<group attribute="{name()}" value="{.}>
<xsl:for-each select="key('all-attributes',
concat(name(), '=', .))">
<xsl:copy-of select=".."/>
</xsl:for-each>
</group>
</xsl:for-each>
</groups>
</xsl:template>
</xsl:stylesheet>
This works with both saxon and msxsl.
Francis.
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list