Count-Elements.xsl

From TEIWiki
Revision as of 16:03, 21 April 2005 by James (talk | contribs) (Stylesheet to count elements)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

This is a short stylesheet which simply counts the elements used in a document and outputs this as the contents of a <tagsDecl> element.

For example, if you run this script on itself, you get:

<?xml version="1.0" encoding="UTF-8"?>
<tagsDecl>
   <tagUsage gi="tagsDecl">1</tagUsage>
   <tagUsage gi="tagUsage">1</tagUsage>
   <tagUsage gi="xsl:for-each">1</tagUsage>
   <tagUsage gi="xsl:key">1</tagUsage>
   <tagUsage gi="xsl:output">1</tagUsage>
   <tagUsage gi="xsl:sort">1</tagUsage>
   <tagUsage gi="xsl:stylesheet">1</tagUsage>
   <tagUsage gi="xsl:template">1</tagUsage>
   <tagUsage gi="xsl:value-of">1</tagUsage>
</tagsDecl>

But that is correct because there is only one instance of each element in the script itself:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>

<xsl:key name="gis" match="*" use="name()"/>

<xsl:template match="node()">
<tagsDecl>
<xsl:for-each select="//*[generate-id(.)=generate-id(key('gis',name(.))[1])]">
 <xsl:sort select="name()"/>
 <tagUsage gi="{name(.)}"><xsl:value-of select="count(key('gis', name(.)))" /></tagUsage>
</xsl:for-each>
</tagsDecl>
</xsl:template>

</xsl:stylesheet>