Francesco Irrera
Francesco Irrera

Reputation: 473

Muenchian Grouping XSLT

This is my XML:

<LIGHT_DESCRIPTION_LIST>
    <LIGHT_DESCRIPTION>
        <LIGHT_CHARACTERISTICS>Fl</LIGHT_CHARACTERISTICS>
        <LIGHT_CATEGORY>17</LIGHT_CATEGORY>
    </LIGHT_DESCRIPTION>
    <LIGHT_DESCRIPTION>
        <LIGHT_CHARACTERISTICS>Fl</LIGHT_CHARACTERISTICS>
        <LIGHT_CATEGORY>UNKNOWN</LIGHT_CATEGORY>
    </LIGHT_DESCRIPTION>
    <LIGHT_DESCRIPTION>
        <LIGHT_CHARACTERISTICS>Fl</LIGHT_CHARACTERISTICS>
        <LIGHT_CATEGORY>UNKNOWN</LIGHT_CATEGORY>
    </LIGHT_DESCRIPTION>
    <LIGHT_DESCRIPTION>
        <LIGHT_CHARACTERISTICS>Fl</LIGHT_CHARACTERISTICS>
        <LIGHT_CATEGORY>17</LIGHT_CATEGORY>
    </LIGHT_DESCRIPTION>
    <LIGHT_DESCRIPTION>
        <LIGHT_CHARACTERISTICS>Fl</LIGHT_CHARACTERISTICS>
        <LIGHT_CATEGORY>UNKNOWN</LIGHT_CATEGORY>
    </LIGHT_DESCRIPTION>      
    <LIGHT_DESCRIPTION>
        <LIGHT_CHARACTERISTICS>Fl</LIGHT_CHARACTERISTICS>
        <LIGHT_CATEGORY>17</LIGHT_CATEGORY>
    </LIGHT_DESCRIPTION>
    <LIGHT_DESCRIPTION>
        <LIGHT_CHARACTERISTICS>Fl</LIGHT_CHARACTERISTICS>
        <LIGHT_CATEGORY>17</LIGHT_CATEGORY>
    </LIGHT_DESCRIPTION>
</LIGHT_DESCRIPTION_LIST>

This is my XSLT:

<xsl:for-each select="LIGHT_DESCRIPTION_LIST">
    <xsl:for-each select="LIGHT_DESCRIPTION">
        <xsl:if test="LIGHT_CATEGORY = '17'">
            <xsl:text>IRA</xsl:text>
        </xsl:if>
    </xsl:for-each>
</xsl:for-each>

In output I had: IRA IRA IRA IRA
I would : IRA ( if exist a light category = 17 write only one time IRA without Repetition)

Upvotes: 0

Views: 60

Answers (2)

Francesco Irrera
Francesco Irrera

Reputation: 473

<xsl:key name="LD" match="//LIGHT_DESCRIPTION" use="."/>


<xsl:for-each select="LIGHT_DESCRIPTION_LIST">
    <xsl:for-each select="LIGHT_DESCRIPTION">
    <xsl:variable name="Light_Desc" select="."/>
        <xsl:for-each select="$Light_Desc[count(. | key('LD', .)[1]) = 1]">
            <xsl:if test="LIGHT_CATEGORY = '17'">
            <xsl:text>IRA</xsl:text>
            </xsl:if>
        </xsl:for-each>
    </xsl:for-each>
</xsl:for-each>

In output this give:

IRA IRA

Upvotes: 0

Joel M. Lamsen
Joel M. Lamsen

Reputation: 7173

Anyway, please try the code below:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:key name="LD" match="LIGHT_DESCRIPTION" use="."/>
    <xsl:variable name="Light_Desc" select="//LIGHT_DESCRIPTION"/>
    <xsl:template match="LIGHT_DESCRIPTION_LIST">
        <xsl:for-each select="$Light_Desc[count(. | key('LD', .)[1]) = 1]">
            <xsl:if test="LIGHT_CATEGORY = '17'">
            <br/>
            <span style="font-family:Univers Condensed; font-size:9pt; ">
                <xsl:text>IRA</xsl:text>
            </span>
            </xsl:if>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>

You must use keys and eliminate duplicates before testing the node content.

Upvotes: 1

Related Questions