RE: [xsl] tag and attribute statistics attached with node sequence

Subject: RE: [xsl] tag and attribute statistics attached with node sequence
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Mon, 23 Apr 2007 17:24:21 +0100
Your actual question seems to be:

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

and I'm afraid I don't understand your English. A little punctuation might
help. It might be better to show the actual result you are getting in XML,
and the desired result.

Your stylesheet appears to be using Xalan syntax for calling extension
functions. We can only guess at what the extension functions do. Your main
reason for using extensions seems to be so that you can write this code in a
procedural way rather than in a functional way. I'd be strongly inclined to
say: if you want to write procedural code, write it in Java; if you want to
write it in XSLT, then write it using a functional approach and stick to
XSLT for the whole thing.

Michael Kay
http://www.saxonica.com/ 

> -----Original Message-----
> From: fatma helmy [mailto:fatmahelmy2000@xxxxxxxxx] 
> Sent: 23 April 2007 16:45
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] 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 

Current Thread