[xsl] problem with XPath count()

Subject: [xsl] problem with XPath count()
From: "Wolfhart Totschnig wolfhart.totschnig@xxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Wed, 1 Nov 2023 04:40:02 -0000
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:


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!

Current Thread