Re: Add element at the end of a variable group of elements

"G. Ken Holman [email protected]" <[email protected]> Wed, 3 Mar 2021 00:12:18 -0000
Newsgroups gmane.text.xml.xsl.general.mulberrytech
Message-ID <[email protected]>
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 [email protected] 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 |
--~----------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
EasyUnsubscribe: http://lists.mulberrytech.com/unsub/xsl-list/3329386
or by email: [email protected]
--~--