Subject: Re: [xsl] preceding-sibling in a group From: "rick@xxxxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Thu, 20 May 2021 20:20:03 -0000 |
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" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns: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 "NOTE" 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 "NOTE" 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 XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list> <http://lists.mulberrytech.com/unsub/xsl-list/612310> EasyUnsubscribe ( <> by email)
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] preceding-sibling in a gr, Michael Kay mike@xxx | Thread | Re: [xsl] preceding-sibling in a gr, Martin Honnen martin |
Re: [xsl] preceding-sibling in a gr, Michael Kay mike@xxx | Date | Re: [xsl] preceding-sibling in a gr, Martin Honnen martin |
Month |