I know that the standard answer in cases like this is "do the
Muenchian". But all the examples I've found deal with the Muenchian
over elements, whereas here, I need a Muenchian on the combination of
attr1 and attr2.
xpath by design aims to treat attributes and elements as equally as
possible, so basically grouping attribute nodes works the same way as
grouping element nodes but you just need to add a @ something like
this:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:key name="p" match="@*" use="."/>
<xsl:key name="pn" match="@*" use="concat(name(),':',.)"/>
<xsl:template match="/">
<properties>
<xsl:for-each
select="root/item/property/@*[generate-id()=generate-id(key('p',.))]">
<property name="{.}" >
<xsl:for-each
select="key('p',.)[generate-id()=generate-id(key('pn',concat(name(),':',.)))]">
<xsl:attribute name="freq_{name()}">
<xsl:value-of select="count(key('pn',concat(name(),':',.)))"/>
</xsl:attribute>
</xsl:for-each>
</property>
</xsl:for-each>
</properties>
</xsl:template>
</xsl:stylesheet>
$ saxon prop.xml prop.xsl
<?xml version="1.0" encoding="utf-8"?>
<properties>
<property name="foo" freq_attr1="1" freq_attr2="1"/>
<property name="bar" freq_attr2="1" freq_attr1="2"/>
<property name="baz" freq_attr2="1"/>
</properties>
--~------------------------------------------------------------------
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>
--~--