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 expression. Thanks again, Wolfhart 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 <http://www.mulberrytech.com/xsl/xsl-list> > EasyUnsubscribe <http://lists.mulberrytech.com/unsub/xsl-list/2652055> > (by email <>)
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] problem with XPath count(, Bauman, Syd s.bauman | Thread | Re: [xsl] problem with XPath count(, ajbufort@xxxxxxxxxxx |
Re: [xsl] problem with XPath count(, Bauman, Syd s.bauman | Date | Re: [xsl] problem with XPath count(, ajbufort@xxxxxxxxxxx |
Month |