Subject: Re: [xsl] Add element at the end of a variable group of elements From: "Wendell Piez wapiez@xxxxxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Wed, 3 Mar 2021 01:04:10 -0000 |
Hi, Like Ken's solution, this relies on a 'pull'. It gives different outputs on a different set of unspecified inputs. (Scatter multiple earths into different places in your solar system and you will see.) <xsl:template match="root"> <xsl:variable name="earthandbeyond" select="(earth|mars)/(. | following-sibling::*)"/> <xsl:variable name="innerplanets" select="child::* except $earthandbeyond"/> <xsl:copy> <xsl:apply-templates select="$innerplanets"/> <moon>many many craters</moon> <xsl:apply-templates select="$earthandbeyond"/> </xsl:copy> </xsl:template> Assuming earth and mars are optional, if you have any planets beyond earth and mars you should name them in $earthandbeyond as well. Enjoy, Wendell On Tue, Mar 2, 2021 at 7:12 PM G. Ken Holman g.ken.holman@xxxxxxxxx < xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: > I would approach this as a grouping issue and not a matching issue. > > I hope this helps. > > . . . . . Ken > > ~/t/ftemp $ cat charles.xml > <?xml version="1.0" encoding="UTF-8"?> > <root> > <foo/> > <bar/> > <mercury/> > <venus/> > <earth earth-type="round"/> > <earth earth-type="flat"/> > <mars/> > </root> > ~/t/ftemp $ xslt2 charles.xml charles.xsl > <?xml version="1.0" encoding="UTF-8"?> > <root> > <foo/> > <bar/> > <mercury/> > <venus/> > <moon>Now with more craters!</moon> > <earth earth-type="round"/> > <earth earth-type="flat"/> > <mars/> > </root> > ~/t/ftemp $ cat charles.xsl > <?xml version="1.0" encoding="UTF-8"?> > <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > xmlns:xsd="http://www.w3.org/2001/XMLSchema" > exclude-result-prefixes="xsd" > version="2.0"> > > <xsl:output indent="yes"/> > > <xsl:template match="root"> > <xsl:copy> > <xsl:for-each-group select="*" > group-adjacent="self::earth or self::mars"> > <xsl:if test="xsd:boolean(current-grouping-key())"> > <moon>Now with more craters!</moon> > </xsl:if> > <xsl:copy-of select="current-group()"/> > </xsl:for-each-group> > </xsl:copy> > </xsl:template> > > </xsl:stylesheet> > ~/t/ftemp $ cat charles2.xml > <?xml version="1.0" encoding="UTF-8"?> > <root> > <foo/> > <bar/> > <mercury/> > <venus/> > <mars/> > </root> > ~/t/ftemp $ xslt2 charles2.xml charles.xsl > <?xml version="1.0" encoding="UTF-8"?> > <root> > <foo/> > <bar/> > <mercury/> > <venus/> > <moon>Now with more craters!</moon> > <mars/> > </root> > ~/t/ftemp $ > > > At 2021-03-03 00:01 +0000, Charles O'Connor coconnor@xxxxxxxxxxxx wrote: > >Hi all, > > > >Using XSLT 2.0, I'd like to add an element at the end of a group of > >elements that may vary whether they exist. > > > >This seems like a classic case that people have to deal with all the > >time, but I've searched without luck, and I'm on maybe lesson 4 of > >??? of the online XSLT course I've been taking for the past decade. > > > >So, given the XML > > > ><root> > > <foo/> > > <bar/> > > <mercury/> > > <venus/> > > <earth earth-type="round"/> > > <earth earth-type="flat"/> > > <mars/> > ></root> > > > >I want to add <moon>Now with more craters!</moon> after the <foo>, > ><bar>, <mercury>, <venus> group of elements and before the <earth>, > ><mars> group of elements, BUT I only know for sure that <foo> and > ><mars> will exist in the input XML. All the others are optional. > > > >In the Oxygen XPath test window, > >"root/(foo|bar|mercury|venus)[last()]" got me where I wanted to be, > >but alas, parentheses are not allowed in the @match for the template. > > > >Thanks! > >Charles > > > >Charles O'Connor [he/him] l Business Analyst > >Aries Systems Corporation l www.ariessys.com > >50 High Street, Suite 21 l North Andover, MA l 01845 l USA > >Direct: 802-585-5655 Main: 978-975-7570 l Help Desk: 978-291-1966 | > >Fax: 978-975-3811 > > > > > > > > > >This message is confidential and is intended solely for the use of > >the individual(s) to whom it is addressed. > >If you have received this message in error, do not open any > >attachment but please notify the sender (above) and delete this > >message from your system. > > > > > -- > Contact info, blog, articles, etc. http://www.CraneSoftwrights.com/s/ | > Check our site for free XML, XSLT, XSL-FO and UBL developer resources | > Streaming hands-on XSLT/XPath 2 training class @US$125 (5 hours free) | > Essays (UBL, XML, etc.) http://www.linkedin.com/today/author/gkholman | > > > -- ...Wendell Piez... ...wendell -at- nist -dot- gov... ...wendellpiez.com... ...pellucidliterature.org... ...pausepress.org... ...github.com/wendellpiez... ...gitlab.coko.foundation/wendell...
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Add element at the end of, G. Ken Holman g.ken. | Thread | Re: [xsl] Add element at the end of, Liam R. E. Quin liam |
Re: [xsl] Add element at the end of, G. Ken Holman g.ken. | Date | Re: [xsl] Re: Add element at the en, G. Ken Holman g.ken. |
Month |