This is the mail archive of the xsl-list@mulberrytech.com mailing list .


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: Getting equivalence classes on attributes


"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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]