[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

Re: [xsl] Count with embedded child elements


Subject: Re: [xsl] Count with embedded child elements
From: Dimitre Novatchev <dnovatchev@xxxxxxxxx>
Date: Mon, 9 Dec 2002 00:16:59 -0800 (PST)

--- I wrote:
> 
> "Bruce Dailey" <bruce@xxxxxxxxxxxx> wrote in message
> news:000001c29ecc$614257d0$0fcbfea9@xxxxxxxxxxx
> > I have an XML file like this
> > 
> > <tu>
> > <tuv>
> > <seg>Y<ut>X</ut>Y</seg>
> > </tuv>
> > </tu>
> > 
> > <tu>
> > <tuv>
> > <seg>X<ut>X</ut>X</seg>
> > </tuv>
> > </tu>
> > 
> > I am trying to count the occurrence of a parameter I am passing in
> > "SearchText", e.g. "X" per TU. So for the above I want 1 returned,
> but I
> > am getting 2 returned using the syntax below: (because 2 text nodes
> in
> > the second <tu> have X in it, I think). 
> > 
> > <xsl:value-of select="count(//tu/tuv/seg/text() [contains (.,
> > $SearchText)])"/>
> > 
> > So, in other words, I want to count the number of <tu>s that have
> the
> > search term in the <seg> element but I want to ignore the text in
> the
> > <ut> element.
> > 
> > Can someone help me out with the correct syntax.
> > 
> > I think my current syntax deals with ignoring the <ut> element but
> > doesn't deal with the multiple text nodes in the <seg> element.
> 
> 
> Use:
> 
> count(//tu/tuv/seg[contains (text() , $SearchText)])


The above is incorrect, it will return 0 when evaluated against the
following xml document:

<t>
  <tu>
    <tuv>
      <seg>Y
        <ut>X</ut>Y
      </seg>
    </tuv>
  </tu>

  <tu>
    <tuv>
      <seg>Y
        <ut>X</ut>X
        <ut>X</ut>X
      </seg>
    </tuv>
  </tu>
</t>

when in fact the correct result is 1 (the second of the //seg elements
has two text node children containing 'X').

The right XPath expression is:

count(
//seg/text()
      [contains(., $SearchText)]
           [not(preceding-sibling::text()[contains(., $SearchText)])]
      )

As you can see, there is a combination of searching and grouping in
this XPath expression.




=====
Cheers,

Dimitre Novatchev.
http://fxsl.sourceforge.net/ -- the home of FXSL

__________________________________________________
Do you Yahoo!?
Yahoo! Mail Plus - Powerful. Affordable. Sign up now.
http://mailplus.yahoo.com

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



Current Thread
Keywords