xslt - Concatenate duplicate elements information based on multiple elements using XSL -


i not bright in xsl. have xml below:

<?xml version="1.0" ?>     <accountitem>          <entry_date>2011-06-24t00:00:00-05:00</entry_date>          <contract>4570000010</contract>          <account>0</account>          <general_desc>systematic withdrawal</general_desc>          <net>1108.3700</net>          <gross>1108.3700</gross>          <person_name>whitey house</person_name>          <last_name>house</last_name>          <agent_name>brown, jack</agent_name>          <legal_verb>n</legal_verb>          <payeename>none</payeename>          <closed_flag>0</closed_flag>     </accountitem>     <accountitem>          <entry_date>2011-06-24t00:00:00-05:00</entry_date>          <contract>4570000010</contract>          <account>0</account>          <general_desc>systematic withdrawal</general_desc>          <net>1108.3700</net>          <gross>1196.5400</gross>          <person_name>whitey house</person_name>          <last_name>house</last_name>          <agent_name>brown, jack</agent_name>          <legal_verb>n</legal_verb>          <payeename>none</payeename>          <closed_flag>0</closed_flag>            </accountitem>     <accountitem>          <entry_date>2011-06-20t00:00:00-05:00</entry_date>          <contract>4570000009</contract>          <account>0</account>          <general_desc>systematic withdrawal</general_desc>          <net>798.4038</net>          <gross>901.5600</gross>          <person_name>whitey house</person_name>          <last_name>house</last_name>          <agent_name>brown, jack</agent_name>          <legal_verb>n</legal_verb>          <payeename>none</payeename>          <closed_flag>0</closed_flag>     </accountitem>     <accountitem>          <entry_date>2011-06-20t00:00:00-05:00</entry_date>          <contract>4570000009</contract>          <account>0</account>          <general_desc>systematic withdrawal</general_desc>          <net>798.4038</net>          <gross>901.5600</gross>          <person_name>whitey house</person_name>          <last_name>house</last_name>          <agent_name>duck, donald q</agent_name>          <legal_verb>n</legal_verb>          <payeename>none</payeename>          <closed_flag>0</closed_flag>     </accountitem>     <accountitem>          <entry_date>2011-06-20t00:00:00-05:00</entry_date>          <contract>4570000009</contract>          <account>0</account>          <general_desc>systematic withdrawal</general_desc>          <net>800.3800</net>          <gross>820.3400</gross>          <person_name>whitey house</person_name>          <last_name>house</last_name>          <agent_name>brown, jack</agent_name>          <legal_verb>n</legal_verb>          <payeename>none</payeename>          <closed_flag>0</closed_flag>     </accountitem>     <accountitem>          <entry_date>2011-06-20t00:00:00-05:00</entry_date>          <contract>4570000009</contract>          <account>0</account>          <general_desc>systematic withdrawal</general_desc>          <net>800.3800</net>          <gross>820.3400</gross>          <person_name>whitey house</person_name>          <last_name>house</last_name>          <agent_name>duck, donald q</agent_name>          <legal_verb>n</legal_verb>          <payeename>none</payeename>          <closed_flag>0</closed_flag>     </accountitem> 

i want converted below:

 <?xml version="1.0" ?>  <accountitem>     <entry_date>2011-06-24t00:00:00-05:00</entry_date>     <contract>4570000010</contract>     <account>0</account>     <general_desc>systematic withdrawal</general_desc>     <net>1108.3700</net>     <gross>1108.3700</gross>     <person_name>whitey house</person_name>     <last_name>house</last_name>     <agent_name>brown, jack</agent_name>     <legal_verb>n</legal_verb>     <payeename>none</payeename>     <closed_flag>0</closed_flag>  </accountitem>  <accountitem>     <entry_date>2011-06-24t00:00:00-05:00</entry_date>     <contract>4570000010</contract>     <account>0</account>     <general_desc>systematic withdrawal</general_desc>     <net>1108.3700</net>     <gross>1196.5400</gross>     <person_name>whitey house</person_name>     <last_name>house</last_name>     <agent_name>brown, jack</agent_name>     <legal_verb>n</legal_verb>     <payeename>none</payeename>     <closed_flag>0</closed_flag>  </accountitem>  <accountitem>     <entry_date>2011-06-20t00:00:00-05:00</entry_date>     <contract>4570000009</contract>     <account>0</account>     <general_desc>systematic withdrawal</general_desc>     <net>798.4038</net>     <gross>901.5600</gross>     <person_name>whitey house</person_name>     <last_name>house</last_name>     <agent_name>brown, jack; duck, donald q</agent_name>     <legal_verb>n</legal_verb>     <payeename>none</payeename>     <closed_flag>0</closed_flag>  </accountitem>  <accountitem>     <entry_date>2011-06-20t00:00:00-05:00</entry_date>     <contract>4570000009</contract>     <account>0</account>     <general_desc>systematic withdrawal</general_desc>     <net>800.3800</net>     <gross>820.3400</gross>     <person_name>whitey house</person_name>     <last_name>house</last_name>     <agent_name>brown, jack; duck, donald q</agent_name>     <legal_verb>n</legal_verb>     <payeename>none</payeename>     <closed_flag>0</closed_flag>  </accountitem> 

or in short, want agent_name concatenated based on contract, account, net, gross combination.

my current xsl below:

           <?xml version="1.0" ?>       <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0">       <xsl:key name="kcontractaccountnetgross" match="accountitem" use="concat(contract,account,format-number(net, '$#,###.00'),format-number(gross, '$#,###.00'))"/>        <xsl:template match="accountitem">       <xsl:variable name="agentinfo">        <xsl:choose>          <xsl:when test="count(key('kcontractaccountnetgross',concat(contract,account,format-number(net, '$#,###.00'),format-number(gross, '$#,###.00')))) > 1">            <xsl:value-of select="concat(agent_name,';',accountitem/agent_name)"/>          </xsl:when>          <xsl:otherwise>            <xsl:value-of select="agent_name"/>          </xsl:otherwise>        </xsl:choose>      </xsl:variable>      <xsl:choose>        <xsl:when test="count(key('kcontractaccountnetgross',concat(contract,account,format-number(net, '$#,###.00'),format-number(gross, '$#,###.00')))) = 1">          <tr>            <xsl:attribute name="class">              <xsl:choose>                <xsl:when test="position() mod 2=0">                  <xsl:text>altitem     </xsl:text>                </xsl:when>                <xsl:otherwise>                  <xsl:text>item     </xsl:text>                </xsl:otherwise>              </xsl:choose>            </xsl:attribute>            <xsl:attribute name="onmouseover">              <xsl:text>this.classname='mouseover'     </xsl:text>            </xsl:attribute>            <xsl:attribute name="onmouseout">              <xsl:choose>                <xsl:when test="position() mod 2=0">                  <xsl:text>this.classname='altitem'     </xsl:text>                </xsl:when>                <xsl:otherwise>                  <xsl:text>this.classname='item'     </xsl:text>                </xsl:otherwise>              </xsl:choose>            </xsl:attribute>            <xsl:attribute name="rowid">              <xsl:value-of select="position()"/>            </xsl:attribute>            <td class="date">              <xsl:attribute name="colname">                <xsl:text>date     </xsl:text>              </xsl:attribute>              <xsl:value-of select="concat(substring(entry_date,6,2),'/', substring(entry_date,9,2), '/',substring(entry_date,1,4))" />            </td>            <td class="contract">              <xsl:attribute name="colname">                <xsl:text>contract     </xsl:text>              </xsl:attribute>              <xsl:choose>                <xsl:when test="closed_flag = 1">                  <xsl:value-of select="contract"/>                </xsl:when>                <xsl:otherwise>                  <a>                    <xsl:attribute name="href">                      <xsl:text>?hash=1&amp;contract=     </xsl:text>                      <xsl:value-of select="contract"/>                      <xsl:text>&amp;account=     </xsl:text>                      <xsl:value-of select="account"/>                    </xsl:attribute>                    <xsl:value-of select="contract"/>                  </a>                </xsl:otherwise>              </xsl:choose>             </td>            <td class="account" colname="account">              <xsl:if test="not($showaccount)">                <xsl:attribute name="style">display:none     </xsl:attribute>              </xsl:if>              <xsl:if test="account!=0">                <xsl:value-of select='account'/>              </xsl:if>            </td>            <td class="tblowner">              <xsl:attribute name="colname">                <xsl:text>owner     </xsl:text>              </xsl:attribute>              <xsl:value-of select='person_name'/>            </td>            <td class="tblowner">              <xsl:attribute name="colname">                <xsl:text>financial advisor     </xsl:text>              </xsl:attribute>              <xsl:value-of select='$agentinfo'/>            </td>            <td class="general_desc">              <xsl:attribute name="colname">                <xsl:text>general_desc     </xsl:text>              </xsl:attribute>              <xsl:value-of select='general_desc'/>            </td>            <td align="right" class="value">              <xsl:attribute name="colname">                <xsl:text>net     </xsl:text>              </xsl:attribute>              <xsl:value-of select="format-number(net, '$#,###.00')"/>            </td>            <td align="right" class="value">              <xsl:attribute name="colname">                <xsl:text>gross     </xsl:text>              </xsl:attribute>              <xsl:value-of select="format-number(gross, '$#,###.00')"/>            </td>            <xsl:if test="payeename!='none'">              <td class="general_desc">                <xsl:attribute name="colname">                  <xsl:text>payeename     </xsl:text>                </xsl:attribute>                <xsl:value-of select='payeename'/>              </td>            </xsl:if>          </tr>        </xsl:when>      </xsl:choose>    </xsl:template>  </xsl:stylesheet> 

i selected xsl section applicable transformation. thoughts?

this example show how want. main point here application of meunchian method perform grouping. i've minimized in transform produced output can see wanted result obtained.

note xml case sensitive. current key not built properly.

<xsl:stylesheet version="1.0"      xmlns:xsl="http://www.w3.org/1999/xsl/transform">      <xsl:output indent="yes"/>      <xsl:key name="k-accounts" match="accountitem"          use="concat(contract,account,format-number(net, '$#,###.00'),format-number(gross, '$#,###.00'))"/>      <xsl:template match="so">         <xsl:apply-templates select="accountitem             [generate-id()             = generate-id(key('k-accounts', concat(contract,account,format-number(net, '$#,###.00'),format-number(gross, '$#,###.00')))             [1])]"/>     </xsl:template>      <xsl:template match="accountitem">         <xsl:copy>             <xsl:copy-of select="contract|account|net|gross"/>             <agent_name>                 <xsl:value-of select="agent_name"/>                 <xsl:apply-templates select="key('k-accounts',                     concat(contract,account,format-number(net, '$#,###.00'),format-number(gross, '$#,###.00')))/agent_name                     [.!=current()/agent_name]"                     mode="agent_name"/>             </agent_name>         </xsl:copy>     </xsl:template>      <xsl:template match="agent_name" mode="agent_name">         <xsl:value-of select="concat('; ',.)"/>     </xsl:template>  </xsl:stylesheet> 

given input (slightly modified make formed):

<so>     <accountitem>         <entry_date>2011-06-24t00:00:00-05:00</entry_date>         <contract>4570000010</contract>         <account>0</account>         <general_desc>systematic withdrawal</general_desc>         <net>1108.3700</net>         <gross>1108.3700</gross>         <person_name>whitey house</person_name>         <last_name>house</last_name>         <agent_name>brown, jack</agent_name>         <legal_verb>n</legal_verb>         <payeename>none</payeename>         <closed_flag>0</closed_flag>     </accountitem>     <accountitem>         <entry_date>2011-06-24t00:00:00-05:00</entry_date>         <contract>4570000010</contract>         <account>0</account>         <general_desc>systematic withdrawal</general_desc>         <net>1108.3700</net>         <gross>1196.5400</gross>         <person_name>whitey house</person_name>         <last_name>house</last_name>         <agent_name>brown, jack</agent_name>         <legal_verb>n</legal_verb>         <payeename>none</payeename>         <closed_flag>0</closed_flag>            </accountitem>     <accountitem>         <entry_date>2011-06-20t00:00:00-05:00</entry_date>         <contract>4570000009</contract>         <account>0</account>         <general_desc>systematic withdrawal</general_desc>         <net>798.4038</net>         <gross>901.5600</gross>         <person_name>whitey house</person_name>         <last_name>house</last_name>         <agent_name>brown, jack</agent_name>         <legal_verb>n</legal_verb>         <payeename>none</payeename>         <closed_flag>0</closed_flag>     </accountitem>     <accountitem>         <entry_date>2011-06-20t00:00:00-05:00</entry_date>         <contract>4570000009</contract>         <account>0</account>         <general_desc>systematic withdrawal</general_desc>         <net>798.4038</net>         <gross>901.5600</gross>         <person_name>whitey house</person_name>         <last_name>house</last_name>         <agent_name>duck, donald q</agent_name>         <legal_verb>n</legal_verb>         <payeename>none</payeename>         <closed_flag>0</closed_flag>     </accountitem>     <accountitem>         <entry_date>2011-06-20t00:00:00-05:00</entry_date>         <contract>4570000009</contract>         <account>0</account>         <general_desc>systematic withdrawal</general_desc>         <net>800.3800</net>         <gross>820.3400</gross>         <person_name>whitey house</person_name>         <last_name>house</last_name>         <agent_name>brown, jack</agent_name>         <legal_verb>n</legal_verb>         <payeename>none</payeename>         <closed_flag>0</closed_flag>     </accountitem>     <accountitem>         <entry_date>2011-06-20t00:00:00-05:00</entry_date>         <contract>4570000009</contract>         <account>0</account>         <general_desc>systematic withdrawal</general_desc>         <net>800.3800</net>         <gross>820.3400</gross>         <person_name>whitey house</person_name>         <last_name>house</last_name>         <agent_name>duck, donald q</agent_name>         <legal_verb>n</legal_verb>         <payeename>none</payeename>         <closed_flag>0</closed_flag>     </accountitem> </so> 

the following output (minimized show correct results achieved) obtained:

<accountitem>    <contract>4570000010</contract>    <account>0</account>    <net>1108.3700</net>    <gross>1108.3700</gross>    <agent_name>brown, jack</agent_name> </accountitem> <accountitem>    <contract>4570000010</contract>    <account>0</account>    <net>1108.3700</net>    <gross>1196.5400</gross>    <agent_name>brown, jack</agent_name> </accountitem> <accountitem>    <contract>4570000009</contract>    <account>0</account>    <net>798.4038</net>    <gross>901.5600</gross>    <agent_name>brown, jack; duck, donald q</agent_name> </accountitem> <accountitem>    <contract>4570000009</contract>    <account>0</account>    <net>800.3800</net>    <gross>820.3400</gross>    <agent_name>brown, jack; duck, donald q</agent_name> </accountitem> 

Comments

Popular posts from this blog

linux - Using a Cron Job to check if my mod_wsgi / apache server is running and restart -

actionscript 3 - TweenLite does not work with object -

php - How can I edit my code to echo the data of child's element where my search term was found in, in XMLReader? -