xsl-list
[Top] [All Lists]

Re: Count() elements in range

2003-10-15 20:05:10
Chris,

At first glance I noticed you have following-sibling wrapped in parentheses. 
The only time you will use parentheses is when you are invoking a function. 
In this case you are just searching for a particular node using a standard 
XPath expression.

So, this...

<xsl:when test="(following-sibling::element[1][child::flag]) or
(count(following-sibling::element) = 0)">

should read like this...

<xsl:when test="following-sibling::element[1][child::flag] | 
count(following-sibling::element) = 0)">

Im rushing out the door and don't have time to look to see what other issues 
you might have or what solutions would work best but if I get back and this 
hasn't helped or someone else hasn't been able to help I will take another 
look at it.

Best regards,

M.


----- Original Message ----- 
From: <Chris(_dot_)Pearson(_at_)agilisys(_dot_)com>
To: <XSL-List(_at_)lists(_dot_)mulberrytech(_dot_)com>
Sent: Wednesday, October 15, 2003 6:33 PM
Subject: [xsl] Count() elements in range


I am wrestling with a problem related to counting a specific range of
elements in a source document. I've tried searching the archives, but I 
was
unable to locate any past discussions that appeared relevant.


Problem: count the number of <element> nodes in the tree starting from the
last <element> or the last <element> whose following-sibling::element does
not have a child <flag>. I think my issue is simply a matter of XPath
expressions, but my brain keeps trying differing versions of recursion 
with
no luck.


Source xml:
<?xml version="1.0" encoding="UTF-8" ?>
<root>
<!--start A series of 1 -->
<element number="A1">
<flag/>
</element>
<!-- start B series of 4 -->
<element number="B1">
<flag/>
</element>
<element  number="B2"/>
<element  number="B3"/>
<element  number="B4"/>
<!-- start C series of 2 -->
<element  number="C1">
<flag/>
</element>
<element  number="C2"/>
<!-- start D series of 3 -->
<element  number="D1">
<flag/>
</element>
<element  number="D2" />
<element  number="D3" />
</root>


Stylesheet so far:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
  version="1.0">
<xsl:output method="text" media-type="text/plain"/>
<xsl:strip-space elements="*" />

<xsl:template match="/root/element">
  <xsl:choose>
    <xsl:when test="(following-sibling::element[1][child::flag]) or
(count(following-sibling::element) = 0)">
      <xsl:call-template name="countFlags">
        <xsl:with-param name="nodeList" 
select="preceding-sibling::element"
/>
      </xsl:call-template>
    </xsl:when>
    <xsl:otherwise />
  </xsl:choose>
</xsl:template>

<xsl:template name="countFlags">
  <xsl:param name="nodeList"/>
<!-- do something here to count the preceding-sibling::element nodes up to
the first <element> whose following-sibling::element does not have a 
<flag>
child. -->
</xsl:template>
</xsl:stylesheet>


Thanks in advance,


Chris



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



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



<Prev in Thread] Current Thread [Next in Thread>