RE: [xsl] How to make this XSLT works for more than two section

Subject: RE: [xsl] How to make this XSLT works for more than two section
From: Robby Pelssers <Robby.Pelssers@xxxxxxx>
Date: Fri, 15 Jun 2012 17:43:58 +0200
Try this one... added a few functions to ease the pain:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
    xmlns:xs="http://www.w3.org/2001/XMLSchema";
    xmlns:custom="www.company.com">

    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:function name="custom:equalPredecingItemCount" as="xs:integer">
      <xsl:param name="preceding_items"/>
      <xsl:param name="this_item"/>
      <xsl:value-of select="sum(for $item in $preceding_items return
custom:getEqualityValue($item, $this_item))"/>
    </xsl:function>

    <xsl:function name="custom:getEqualityValue" as="xs:integer">
      <xsl:param name="item1"/>
      <xsl:param name="item2"/>
      <xsl:value-of select="if (deep-equal($item1, $item2)) then 1 else 0"/>
    </xsl:function>

    <xsl:template match="node()|@*">
      <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
    </xsl:template>

    <!-- we skip the item if it has at least 1 equal preceding item  -->
    <xsl:template
match="item1[custom:equalPredecingItemCount(preceding::item1, .) > 0]"/>

</xsl:stylesheet>

-----Original Message-----
From: Wolfgang Laun [mailto:wolfgang.laun@xxxxxxxxx]
Sent: Wednesday, June 13, 2012 2:43 PM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: Re: [xsl] How to make this XSLT works for more than two section

I find that I get the desired output, except for the last item1, which
is also removed, but that has a matching predecessor, i.e., the second
item1 in the output.
-W

On 13/06/2012, Jo Na <jkoe888@xxxxxxxxx> wrote:

> And desired Output:
> <myroot>
>     <RNC>
>         <nodeA id="a">
>             <section id="i">
>                 <item1 id="0" method="delete"/>
>                 <item1 id="1" method="create">
>                     <otherchild>a</otherchild>
>                 </item1>
>             </section>
>             <section id="i">
>                 <item1 id="0" method="delete"> <!-- third consecutive
> delete BUT children have different value , so we don't remove this -->
>                     <somechild>bbb</somechild>
>                 </item1>
>                 <item1 id="3" method="create">
>                     <other>xx</other>
>                 </item1>
>                 <item1 id="0" method="create">
>                     <otherchild>a</otherchild>
>                 </item1>
>             </section>
>             <section id="i">
>                 <item1 id="1" method="create">
>                     <otherchild>a</otherchild>
>                 </item1>
>             </section>
>         </nodeA>
>     </RNC>
> </myroot>
>
> How to fix the XSLT to apply to more than two sections with the same
> id as shown on the example. (right now the algorithm works fine for
> only two sections with the same id)
>
> The objective is to remove node with successive duplicate with the
> same element name item1 item2 etc, same id and same method.
> An XML node followed by other node with exact same element name, same
> id, same method and same children will be considered duplicate.
> if the two nodes being compared did not share the same 'nodeA' level
> node, then they should not be considered as duplicates to be removed
>
> Thank you.
> Jo

Current Thread