|
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 |