Re: [xsl] preceding-sibling in a group

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