Subject: AW: tag and attribute statistics attached with node sequence
From: Klöck, Erwin <Erwin.Kloeck@xxxxxxxxxxx>
Date: Mon, 23 Apr 2007 18:10:06 +0200
|
Erwin Klvck
Bayerische Landesbank
Geschdftsbereich Corporate Services
Team IT-Finance -4464-
Brienner Stra_e 24 Rgb.
80333 M|nchen
Telefon: +49 89 2171-21420
Telefax: +49 89 2171-27546
mailto:erwin.kloeck@xxxxxxxxxxx
Internet: http://www.bayernlb.de
> -----Urspr|ngliche Nachricht-----
> Von: fatma helmy [mailto:fatmahelmy2000@xxxxxxxxx]
> Gesendet: Montag, 23. April 2007 17:45
> An: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Betreff: tag and attribute statistics attached with
> node sequence
>
> Dear all
> can i ask a question on XSLT ? pls, if this group is
> not interested in xslt, would any one know the answer
> reply me ?
> suppose i have the following xslt
> <?xml version="1.0" encoding="UTF-8" ?>
> <!--
> <!DOCTYPE stylesheet
> PUBLIC "-//W3C//DTD XSLT 1.0//EN"
> "http://www.w3.org/1999/XSL/Transform";>
> -->
> <xsl:stylesheet version="1.0"
>
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
> xmlns:lxslt="http://xml.apache.org/xslt";
> xmlns:kite="http://www.kite.org.il";
> xmlns:frequency="FrequenciesCounter"
> xmlns:auxiliary="Auxiliary"
> extension-element-prefixes="frequency
> auxiliary">
>
> <!-- DistinctNamesCounter extension (Java) -->
> <lxslt:component prefix="frequency"
> elements="" functions="incr
> incrAttr count countPath countAttr countAttrValues
> countAttrPerPath countAttrValuePerPath getTags
> getDepths getPaths getAttrs getAttrValues
> getAttrsPerPath getAttrValuesPerPath dumpDictionary">
> <lxslt:script lang="javaclass"
> src="org.kite.dm.xslt.FrequenciesCounter"/>
> </lxslt:component>
> <lxslt:component prefix="auxiliary"
> elements=""
> functions="suppressWhitespace">
> <lxslt:script lang="javaclass"
> src="org.kite.dm.Auxiliary"/>
> </lxslt:component>
> <!-- output format -->
> <xsl:output method="xml" indent="yes"
> encoding="UTF-8" />
> <xsl:strip-space elements="*"/>
> <xsl:param name="dictionary" select="'dictionary'"/>
> <!-- template: root (real node from the first time)
> -->
> <xsl:template match="/*">
> <!-- make a pass over the whole tree, calculating
> the frequencies -->
> <xsl:call-template name="calculate-frequencies" />
> <!-- get the frequencies in XML format, and sort
> them -->
> <xsl:element name="frequencies">
> <xsl:call-template name="show-frequencies" />
> </xsl:element>
>
> <xsl:call-template name="dump-dictionary">
> <xsl:with-param name="dict-path"
> select="$dictionary"/>
> </xsl:call-template>
> </xsl:template>
>
> <!-- make a pass over the whole tree, calculating
> the frequencies -->
> <xsl:template name="calculate-frequencies">
> <xsl:param name="depth" select="1"/>
> <!-- count the current tag's name -->
> <xsl:variable name="tagName" select="name()"/>
> <xsl:variable name="ignore"
> select="frequency:incr($tagName,string($depth))"/>
> <!-- count current tag's attributes' values -->
> <xsl:for-each select="@*">
> <xsl:variable name="ignore"
> select="frequency:incrAttr($tagName,name(),auxiliary:suppressW
> hitespace(string(.)))"/>
> </xsl:for-each>
> <!-- count current tag's text nodes -->
> <xsl:for-each select="text()">
> <xsl:variable name="text-rep"
> select="auxiliary:suppressWhitespace(string(.))"/>
> <xsl:if test="not($text-rep = '')">
> <xsl:variable name="ignore"
> select="frequency:incrAttr($tagName,concat('text-node-',positi
on()),$text-rep)"/>
> </xsl:if>
> </xsl:for-each>
> <!-- descend to all the children -->
> <xsl:for-each select="*">
> <xsl:call-template name="calculate-frequencies">
> <xsl:with-param name="depth"
> select="$depth+1"/>
> </xsl:call-template>
> </xsl:for-each>
> </xsl:template>
> <!-- give the frequencies in XML format -->
> <xsl:template name="show-frequencies">
> <xsl:for-each select="frequency:getTags()">
> <xsl:variable name="tag-name"
> select="string(.)"/>
> <xsl:element name="tag">
> <xsl:attribute name="name">
> <xsl:value-of select="$tag-name" />
> </xsl:attribute>
> <xsl:attribute name="count">
> <xsl:value-of
> select="frequency:count($tag-name)" />
> </xsl:attribute>
> <!-- produce frequencies per depths -->
> <xsl:call-template
> name="show-frequencies-per-depth">
> <xsl:with-param name="tag-name"
> select="$tag-name" />
> </xsl:call-template>
> <!-- produce paths per tag -->
> <xsl:call-template name="show-paths-per-tag">
> <xsl:with-param name="tag-name"
> select="$tag-name" />
> </xsl:call-template>
> <!-- produce attrs per tag -->
> <xsl:call-template name="show-attrs-per-tag">
> <xsl:with-param name="tag-name"
> select="$tag-name" />
> </xsl:call-template>
> </xsl:element>
> </xsl:for-each>
> </xsl:template>
> <!-- give the frequencies per depth -->
> <xsl:template name="show-frequencies-per-depth">
> <xsl:param name="tag-name" />
> <xsl:for-each
> select="frequency:getDepths($tag-name)">
> <xsl:element name="tag-per-depth">
> <xsl:attribute name="depth">
> <xsl:value-of select="." />
> </xsl:attribute>
> <xsl:attribute name="count">
> <xsl:value-of
> select="frequency:count($tag-name,string(.))" />
> </xsl:attribute>
> </xsl:element>
> </xsl:for-each>
> </xsl:template>
> <!-- give paths per tag -->
> <xsl:template name="show-paths-per-tag">
> <xsl:param name="tag-name" />
> <xsl:for-each
> select="frequency:getPaths($tag-name)">
> <xsl:variable name="path" select="string(.)"/>
>
> <xsl:element name="path-per-tag">
> <xsl:attribute name="name">
> <xsl:value-of select="$tag-name" />
> </xsl:attribute>
> <xsl:attribute name="path">
> <xsl:value-of select="$path" />
> </xsl:attribute>
> <xsl:attribute name="count">
> <xsl:value-of
> select="frequency:countPath($tag-name,string(.))" />
> </xsl:attribute>
> <!-- produce attrs per path -->
> <xsl:call-template
> name="show-attrs-per-tag-path">
> <xsl:with-param name="tag-name"
> select="$tag-name" />
> <xsl:with-param name="path" select="$path"/>
> </xsl:call-template>
> </xsl:element>
> </xsl:for-each>
> </xsl:template>
> <!-- give attrs per tag -->
> <xsl:template name="show-attrs-per-tag">
> <xsl:param name="tag-name"/>
> <xsl:for-each
> select="frequency:getAttrs($tag-name)">
> <xsl:variable name="attr-name"
> select="string(.)"/>
>
> <xsl:element name="attr-per-tag">
> <xsl:attribute name="name">
> <xsl:value-of select="$attr-name"/>
> </xsl:attribute>
> <xsl:attribute name="count">
> <xsl:value-of
> select="frequency:countAttr($tag-name,$attr-name)"/>
> </xsl:attribute>
> <!-- produce attr values per attr -->
> <xsl:call-template
> name="show-values-per-attr">
> <xsl:with-param name="tag-name"
> select="$tag-name"/>
> <xsl:with-param name="attr-name"
> select="$attr-name"/>
> </xsl:call-template>
> </xsl:element>
> </xsl:for-each>
> </xsl:template>
> <!-- give attr values per attr -->
> <xsl:template name="show-values-per-attr">
> <xsl:param name="tag-name"/>
> <xsl:param name="attr-name"/>
> <xsl:for-each
> select="frequency:getAttrValues($tag-name,$attr-name)">
> <xsl:element name="value-per-attr">
> <xsl:attribute name="value">
> <xsl:value-of select="."/>
> </xsl:attribute>
> <xsl:attribute name="count">
> <xsl:value-of
> select="frequency:countAttrValue($tag-name,$attr-name,string(.))"/>
> </xsl:attribute>
> </xsl:element>
> </xsl:for-each>
>
> </xsl:template>
>
> <!-- give attrs per tag per path -->
> <xsl:template name="show-attrs-per-tag-path">
> <xsl:param name="tag-name"/>
> <xsl:param name="path"/>
> <xsl:for-each
> select="frequency:getAttrsPerPath($tag-name,$path)">
> <xsl:variable name="attr-name"
> select="string(.)"/>
>
> <xsl:element name="attr-per-path">
> <xsl:attribute name="name">
> <xsl:value-of select="$attr-name"/>
> </xsl:attribute>
> <xsl:attribute name="count">
> <xsl:value-of
> select="frequency:countAttrPerPath($tag-name,$attr-name,$path)"/>
> </xsl:attribute>
> <!-- produce attr values per attr -->
> <xsl:call-template
> name="show-values-per-attr-path">
> <xsl:with-param name="tag-name"
> select="$tag-name"/>
> <xsl:with-param name="attr-name"
> select="$attr-name"/>
> <xsl:with-param name="path" select="$path"/>
> </xsl:call-template>
> </xsl:element>
> </xsl:for-each>
> </xsl:template>
> <!-- give attr values per attr per path -->
> <xsl:template name="show-values-per-attr-path">
> <xsl:param name="tag-name"/>
> <xsl:param name="attr-name"/>
> <xsl:param name="path"/>
> <xsl:for-each
> select="frequency:getAttrValuesPerPath($tag-name,$attr-name,$path)">
> <xsl:element name="value-per-attr-per-path">
> <xsl:attribute name="value">
> <xsl:value-of select="."/>
> </xsl:attribute>
> <xsl:attribute name="count">
> <xsl:value-of
> select="frequency:countAttrValuePerPath($tag-name,$attr-name,s
tring(.),$path)"/>
> </xsl:attribute>
> </xsl:element>
> </xsl:for-each>
>
> </xsl:template>
> <xsl:template name="dump-dictionary">
> <xsl:param name="dict-path"/>
> <xsl:variable name="ignore"
> select="frequency:dumpDictionary($dict-path)"/>
> </xsl:template>
> </xsl:stylesheet>
>
> the above xslt produces a statistics on tag counts
> for example
> suppose i have this xml
> <bookstore>
> <book>
> <author> john </author>
> </book>
> <book>
> <author> mary </author>
> </book>
> </bookstore>
>
> the following statistics will be
> <tag> author </tag>
> repeted twice in the path book/author
> it has the following value john and mary
> what i need is to add instruction that would give the
> following
> <tag> author </tag>
> repeted twice in the path book/author
> it has the following value john in the first book and
> mary in the second book
>
> __________________________________________________
> Do You Yahoo!?
> Tired of spam? Yahoo! Mail has the best spam protection around
> http://mail.yahoo.com
|