--- I wrote:
"Bruce Dailey" <bruce(_at_)bmdailey(_dot_)com> wrote in message
news:000001c29ecc$614257d0$0fcbfea9(_at_)pentium4(_dot_)(_dot_)(_dot_)
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