Subject: Re: [xsl] with XPath 1.0, select all following sibling elements of name "foo" up to the first non-"foo" element From: "Wolfhart Totschnig wolfhart.totschnig@xxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Thu, 18 Feb 2021 18:43:05 -0000 |
Hello again, Thank you, Wendell! The proposed solutions leave me with two questions: 1) Is there a way to do what I originally had in mind, i.e., go forward to the first non-"foo" sibling and from there go backwards, taking all the "foo" siblings up to the current node? Asked differently, can the following XPath expression be fixed? following-sibling::*[not(self::source)][1]/preceding-sibling::*[self::source][preceding-sibling::current()] Specifically, can "preceding-sibling::current()" be fixed? 2) Liam's and Wendell's proposals involve the expression [name()=...], whereas I have used [self:: ...]. Are these strictly equivalent, or is there a reason to prefer the one over the other? Thanks again for your help! Wolfhart On 18-02-21 13:06, Wendell Piez wapiez@xxxxxxxxxxxxxxx wrote: > Hi, > > With a sequence of variable declarations: > > <xsl:variable name="name" select="name()"/> > <xsl:variable name="followers" > select="following-sibling::*[name()=$name]"/> > <xsl:variable name="interlopers" > select="following-sibling::*[not(name()=$name)] | > following-sibling::*[not(name()=$name)]/following-sibling::*"/> > <xsl:variable name="invited" select=". | > $followers[not(count(.|$interlopers)=count($interlopers))]"/> > > Note: untested. > > Good luck, > Wendell > > > On Wed, Feb 17, 2021 at 8:32 PM Wolfhart Totschnig > wolfhart.totschnig@xxxxxxxxxxx <mailto:wolfhart.totschnig@xxxxxxxxxxx> > <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx > <mailto:xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>> wrote: > > Dear list, > > I am facing an XPath problem for which I cannot find the solution. I > want to select all following sibling elements of name "foo" up to the > first non-"foo" element. So, in the following case, the first two > <foo> > elements should be selected: > > <foo/> > <foo/> > <bar/> > <foo/> > > In the following case, all three <foo> elements should be selected: > > <foo/> > <foo/> > <foo/> > > And in the following case, nothing should be selected: > > <bar/> > <foo/> > <foo/> > > I came up with the following non-working approach: > > B B B B B B B B B B <xsl:choose> > B B B B B B B B B B B B B <xsl:when > test="not(following-sibling::*[not(self::foo)])"> > B B B B B B B B B B B B B B B B <xsl:value-of select="following-sibling::*"/> > B B B B B B B B B B B B B </xsl:when> > B B B B B B B B B B B B B <xsl:otherwise> > B B B B B B B B B B B B B B B B <xsl:value-of > select="following-sibling::*[not(self::source)][1]/preceding-sibling::*[self::source][preceding-sibling::current()]"/> > B B B B B B B B B B B B B </xsl:otherwise> > B B B B B B B B B B </xsl:choose> > > That is, test whether there are non-"foo" following siblings. If > there > are none, take all following siblings. If there are, go forward to > the > first non-"foo" sibling, and from there go backwards, taking all the > "foo" siblings up to the current node. > > But this does not work. Apparently, the expression > "preceding-sibling::current()" is not a valid construct. So what > is the > correct way to do what I have in mind (or a simpler solution, if > there > is one). Please note that this stylesheet needs to be executed by > a web > browser, and so the solution has to remain within XPath 1.0. > > Thanks in advance for your help! > Wolfhart > > > > > -- > ...Wendell Piez... ...wendell -at- nist -dot- gov... > ...wendellpiez.com... ...pellucidliterature.org... ...pausepress.org... > ...github.com/wendellpiez. <http://github.com/wendellpiez.>.. > ...gitlab.coko.foundation/wendell... > 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] with XPath 1.0, select al, Wendell Piez wapiez@ | Thread | Re: [xsl] with XPath 1.0, select al, G. Ken Holman g.ken. |
[xsl] [Markup] [ANN] Balisage 2021 , B Tommie Usdin btusd | Date | Re: [xsl] with XPath 1.0, select al, G. Ken Holman g.ken. |
Month |