Martin's suggestions would both work. Another idea would be
<xsl:variable name="first-note"
select="current-group/PART_DES[matches(.,'NOTE')][1]
>
> <xsl:for-each select="current-group()">
> <xsl:choose>
> <xsl:when test=". is $first-note or . >> $first-note">
> <note>
...
Michael Kay
Saxonica
> On 20 May 2021, at 21:20, rick@xxxxxxxxxxxxxx
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
>
> Here is my sample input:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <dataroot>
> <DH675AU>
> <FIG_NO>99999</FIG_NO>
> <PART_DES>DIPSTICK</PART_DES>
> </DH675AU>
> <DH675AU>
> <FIG_NO>99999</FIG_NO>
> <PART_DES>O-RING</PART_DES>
> </DH675AU>
> <DH675AU>
> <FIG_NO>99999</FIG_NO>
> <PART_DES>SCREW, SELF-TAPPING</PART_DES>
> </DH675AU>
> <DH675AU>
> <FIG_NO>99999</FIG_NO>
> <PART_DES>NOTE: (1) NOT SERVICED SEPARATELY. INCLUDED IN</PART_DES>
> </DH675AU>
> <DH675AU>
> <FIG_NO>99999</FIG_NO>
> <PART_DES>58F-98-40740 SEAL KIT.</PART_DES>
> </DH675AU>
> <DH675AU>
> <FIG_NO>69500</FIG_NO>
> <PART_DES>DIPSTICK</PART_DES>
> </DH675AU>
> <DH675AU>
> <FIG_NO>69500</FIG_NO>
> <PART_DES>O-RING</PART_DES>
> </DH675AU>
> <DH675AU>
> <FIG_NO>69500</FIG_NO>
> <PART_DES>SCREW, SELF-TAPPING</PART_DES>
> </DH675AU>
> </dataroot>
>
> Here is my desired output:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <root>
> <entry>
> <figure>99999</figure>
> <description>DIPSTICK</description>
> <description>O-RING</description>
> <description>SCREW, SELF-TAPPING</description>
> <note>NOTE: (1) NOT SERVICED SEPARATELY. INCLUDED IN</note>
> <note>58F-98-40740 SEAL KIT.</note>
> </entry>
> <entry>
> <figure>69500</figure>
> <description>DIPSTICK</description>
> <description>O-RING</description>
> <description>SCREW, SELF-TAPPING</description>
> </entry>
> </root>
>
> Here is my stylesheet:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform
<http://www.w3.org/1999/XSL/Transform>"
> xmlns:xs="http://www.w3.org/2001/XMLSchema
<http://www.w3.org/2001/XMLSchema>"
> xmlns:math="http://www.w3.org/2005/xpath-functions/math
<http://www.w3.org/2005/xpath-functions/math>"
> exclude-result-prefixes="xs math"
> version="3.0" expand-text="true">
>
> <xsl:output method="xml" indent="yes"/>
>
> <xsl:template match="/dataroot">
> <root>
> <xsl:call-template name="make-components"/>
> </root>
> </xsl:template>
>
> <xsl:template name="make-components">
> <xsl:for-each-group select="*" group-by="child::FIG_NO">
> <xsl:call-template name="make-entries"/>
> </xsl:for-each-group>
> </xsl:template>
>
> <xsl:template name="make-entries">
> <entry>
> <figure><xsl:apply-templates
select="current-group()[1]/FIG_NO"/></figure>
> <xsl:for-each select="current-group()">
> <xsl:choose>
> <xsl:when test="PART_DES[matches(.,'NOTE')] or
preceding::PART_DES[matches(.,'NOTE')]">
> <note>
> <xsl:apply-templates select="PART_DES"/>
> </note>
> </xsl:when>
> <xsl:otherwise>
> <description>
> <xsl:apply-templates select="PART_DES"/>
> </description>
> </xsl:otherwise>
> </xsl:choose>
> </xsl:for-each>
> </entry>
> </xsl:template>
>
> </xsl:stylesheet>
>
> Here is what I am getting:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <root>
> <entry>
> <figure>99999</figure>
> <description>DIPSTICK</description>
> <description>O-RING</description>
> <description>SCREW, SELF-TAPPING</description>
> <note>NOTE: (1) NOT SERVICED SEPARATELY. INCLUDED IN</note>
> <note>58F-98-40740 SEAL KIT.</note>
> </entry>
> <entry>
> <figure>69500</figure>
> <note>DIPSTICK</note>
> <note>O-RING</note>
> <note>SCREW, SELF-TAPPING</note>
> </entry>
> </root>
>
> The idea is that when I see a bNOTEb string, I want that entry and all
following within the same group to be <note> elements. So I am look for
preceding-sibling or self that contains bNOTEb but restricted to the same
group. I am using XSLT 3. Thank you very much.
>
> Rick
>
> Rick Quatro
> Carmen Publishing Inc.
> 585-729-6746
> rick@xxxxxxxxxxxxxxx <mailto:rick@xxxxxxxxxxxxxxx>
> http://www.frameexpert.com/store <http://www.frameexpert.com/store>
>
>
> XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list>
> EasyUnsubscribe <http://lists.mulberrytech.com/unsub/xsl-list/612310> (by
email <applewebdata://E82B001C-7C55-4AE4-9E27-67B33E3B9491>)
> XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list>
> EasyUnsubscribe <http://lists.mulberrytech.com/unsub/xsl-list/293509> (by
email <>)
|