RE: [xsl] xslt 2

Subject: RE: [xsl] xslt 2
From: "Michael Kay" <mhk@xxxxxxxxx>
Date: Tue, 10 Jun 2003 11:50:21 +0100
Your variable $cnt is a temporary tree, that is, a sequence containing
exactly one document node. So applying avg() to it is not going to do
much good.

Also the type of your sequence is xs:integer* rather than xs:integer
(it's a sequence of integers).

The simple way to do this is:

<xsl:function name="dp:childCount">
<xsl:param name="nm"/>
<xsl:sequence 
  select="avg(for $n in $root//*[name() = $nm] 
              return count($n//*))"/>
</xsl:function>

If you don't want to use the XPath "for" expression (some people dislike
writing long XPath expressions) you can do more of the work at the XSLT
level:

<xsl:function name="dp:childCount">
<xsl:param name="nm"/>
<xsl:variable name="counts" as="xs:integer*">
  <xsl:for-each select="$root//*[name() = $nm]">
    <xsl:copy-of select="count(.//*)"/>
  </xsl:for-each>
</xsl:variable>
<xsl:sequence select="avg($counts)"/>
</xsl:function>

The "as" attribute on xsl:variable ensures that the result is a sequence
rather than a tree, and using xsl:copy-of avoids converting the integers
into text nodes and then back to integers, which is what happens if you
use xsl:value-of.

Michael Kay


> -----Original Message-----
> From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx 
> [mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of 
> David.Pawson@xxxxxxxxxxx
> Sent: 10 June 2003 10:02
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] xslt 2
> 
> 
> <xsl:function name="dp:childCount">
>   <xsl:param name="nm" />
>   <xsl:variable name="cnt">
>   <xsl:sequence as="xs:integer">
>   <xsl:for-each select="$root//*[name() = $nm]">
>     <xsl:value-of select="count(.//*)"/>
>   </xsl:for-each>
> </xsl:sequence>
> </xsl:variable>
> 
> <xsl:sequence select="avg($cnt)"/>
> </xsl:function>
> 
> 
> Failing miserably.
> $root set to root of source document.
> param is a string, name of an element in that document.
> 
> Requirement is to return the average number  of children over 
> all such elements in that document.
> 
> Idea is to build a sequence of ints, each being the count of 
> the number of element children.
> 
> Any help appreciated.
> 
> regards DaveP
> 
> 
> 
> Regards DaveP.
> 
> **** snip here *****
> 
> - 
> 
> NOTICE: The information contained in this email and any 
> attachments is 
> confidential and may be legally privileged. If you are not the 
> intended recipient you are hereby notified that you must not use, 
> disclose, distribute, copy, print or rely on this email's content. If 
> you are not the intended recipient, please notify the sender 
> immediately and then delete the email and any attachments from your 
> system.
> 
> RNIB has made strenuous efforts to ensure that emails and any 
> attachments generated by its staff are free from viruses. However, it 
> cannot accept any responsibility for any viruses which are 
> transmitted. We therefore recommend you scan all attachments.
> 
> Please note that the statements and views expressed in this email 
> and any attachments are those of the author and do not necessarily 
> represent those of RNIB.
> 
> RNIB Registered Charity Number: 226227
> 
> Website: http://www.rnib.org.uk 
> 
>  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
> 


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread