Re: [xsl] problem with XPath count()

Subject: Re: [xsl] problem with XPath count()
From: "Wolfhart Totschnig wolfhart.totschnig@xxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Wed, 1 Nov 2023 05:19:55 -0000
Thank you, Syd, for the prompt reply! I think that, thanks to your 
reply, I figured out what is going on: The preceding:: axis constructs a 
node set in reverse order. Hence, preceding::text[position() = 1] refers 
to the immediately preceding <text> element, not to the first <text> 
element in document order. That explains the count that I got with my 

Thanks again,

On 11/1/23 01:53, Bauman, Syd s.bauman@xxxxxxxxxxxxxxxx wrote:
> I am not sure I could explain precisely what /is/ going on here with 
> position() if I were fully awake, but there is no chance I can do so 
> now (it is, after all /way/ past my bedtime), but the apparent 
> miscount boils down to the basic problem that position() doesnbt mean 
> what we often, at first blush, think means. (Although often enough it 
> is close enough to what we think that it works.)
> The problem is solved by replacing the call to position() with another 
> count:
> count( preceding::text[ count( preceding::text ) eq 0 B or B substring( 
> ., 1, 1 ) eq 'x'] )
> P.S. I presume your input is something like the following, even though 
> the initial bxb in the content was missing in the post.
> <?xml version="1.0" encoding="UTF-8"?>
> <outer>
> <text>foo</text>
> <text>xfoo</text>
> <text>foo</text>
> <text>xfoo</text>
> </outer>
> If it is much more complicated, you might need to be using 
> preceding-sibling:: instead.
> ------------------------------------------------------------------------
> *From:* Wolfhart Totschnig wolfhart.totschnig@xxxxxxxxxxx 
> <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
> *Sent:* Wednesday, November 1, 2023 00:40
> *To:* xsl-list@xxxxxxxxxxxxxxxxxxxxxx <xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
> *Subject:* [xsl] problem with XPath count()
> Dear list,
> There is a seemingly simple XPath problem to which I cannot find the
> solution. I'm hoping (or, rather, certain) that one of you can help me.
> I have a list of <text> elements, like so:
> <text>foo</text>
> <text>foo</text>
> <text>foo</text>
> <text>foo</text>
> I want to count, for each element, the number of preceding <text>
> elements that satisfy one or both of the following two conditions: 1)
> the element is the first of the list or 2) its string value begins with
> "x". Here is an example, with the expected number of the count after the
> element:
> <text>foo</text>B B B  B B B  0B B  (no preceding <text> element that satisfies
> either of the conditions)
> <text>xfoo</text>B B B  B  1B B  (one preceding <text> element thatB satisfies
> condition 1)
> <text>foo</text>B B B  B B B  2B B  (one preceding <text> element thatB satisfies
> condition 1 + one preceding <text> element thatB satisfies condition 2)
> <text>xfoo</text>B B B B B  2 B B (same as with the previous element)
> I thought that it would be as simple as the following:
> count(preceding::text[position() = 1 or substring(., 1, 1) = 'x'])
> But this XPath expression does not give the expected result. It gives
> the following:
> <text>foo</text>B B B  B B B  0
> <text>xfoo</text>B B B  B  1
> <text>foo</text>B B B  B B B  1
> <text>xfoo</text>B B B B B  2
> That is, on the third element it gives "1" whereas I would expect "2".
> What am I misunderstanding?
> Thanks in advance for your help!
> Wolfhart
> XSL-List info and archive <>
> EasyUnsubscribe <> 
> (by email <>)

Current Thread