xsl-list
[Top] [All Lists]

[xsl] comparing following nodes and re-structuring.

2011-12-06 08:17:23
I could use some help with the following problem.

I have an XML instance that is a long list of table entries. I need to compare 
text nodes and if they are the same, restructure an aspect of the row. I have 
been able to write something that will compare only the first following and 
first preceding rows, but I need to be able to traverse multiple rows until the 
matching stops. If there is no duplicate NSN, then merely copy the row as is.



A sample of the input:

   <nsnindx>
      <nsnindxrow>
         <nsn>
            <fsc>5905</fsc>
            <niin>00-004-6116</niin>
         </nsn>
         <callout assocfig="P4503692350366-FIG026" label="36"/>
      </nsnindxrow>
      <nsnindxrow>
         <nsn>
            <fsc>5905</fsc>
            <niin>00-004-6116</niin>
         </nsn>
         <callout assocfig="P4502792350366-FIG017" label="36"/>
      </nsnindxrow>
      <nsnindxrow>
         <nsn>
            <fsc>5905</fsc>
            <niin>00-004-6117</niin>
         </nsn>
         <callout assocfig="P4503692350366-FIG026" label="36"/>
      </nsnindxrow>
      <nsnindxrow>
         <nsn>
            <fsc>5905</fsc>
            <niin>00-004-6117</niin>
         </nsn>
         <callout assocfig="P4502792350366-FIG017" label="36"/>
      </nsnindxrow>
      <nsnindxrow>
         <nsn>
            <fsc>5905</fsc>
            <niin>00-004-6120</niin>
         </nsn>
         <callout assocfig="P4503692350366-FIG026" label="36"/>
      </nsnindxrow>
      <nsnindxrow>
         <nsn>
            <fsc>5905</fsc>
            <niin>00-004-6120</niin>
         </nsn>
         <callout assocfig="P4502792350366-FIG017" label="36"/>
      </nsnindxrow>
      <nsnindxrow>
         <nsn>
            <fsc>6145</fsc>
            <niin>00-013-8651</niin>
         </nsn>
         <callout assocfig="P4505792350366-FIGBULK" label="42"/>
      </nsnindxrow>
      <nsnindxrow>
         <nsn>
            <fsc>5310</fsc>
            <niin>00-014-5850</niin>
         </nsn>
         <callout assocfig="P4500292350366-FIG001" label="17"/>
      </nsnindxrow>
      <nsnindxrow>
         <nsn>
            <fsc>5310</fsc>
            <niin>00-014-5850</niin>
         </nsn>
         <callout assocfig="P4500892350366-FIG007" label="30"/>
      </nsnindxrow>
      <nsnindxrow>
         <nsn>
            <fsc>5310</fsc>
            <niin>00-014-5850</niin>
         </nsn>
         <callout assocfig="P4501892350366-FIG046" label="7"/>
      </nsnindxrow>
      <nsnindxrow>
         <nsn>
            <fsc>5310</fsc>
            <niin>00-014-5850</niin>
         </nsn>
         <callout assocfig="P4502292350366-FIG032" label="9"/>
      </nsnindxrow>
      <nsnindxrow>
         <nsn>
            <fsc>5310</fsc>
            <niin>00-045-3296</niin>
         </nsn>
         <callout assocfig="P4503892350366-FIG027" label="19"/>
      </nsnindxrow>
   </nsnindx>

The desired output:


   <nsnindx>
      <nsnindxrow>
         <nsn>
            <fsc>5905</fsc>
            <niin>00-004-6116</niin>
         </nsn>
         <callout assocfig="P4503692350366-FIG026" label="36"/>
         <callout assocfig="P4502792350366-FIG017" label="36"/>
      </nsnindxrow>
      <nsnindxrow>
         <nsn>
            <fsc>5905</fsc>
            <niin>00-004-6117</niin>
         </nsn>
         <callout assocfig="P4503692350366-FIG026" label="36"/>
           <callout assocfig="P4502792350366-FIG017" label="36"/>
      </nsnindxrow>
      <nsnindxrow>
         <nsn>
            <fsc>5905</fsc>
            <niin>00-004-6120</niin>
         </nsn>
         <callout assocfig="P4503692350366-FIG026" label="36"/>
         <callout assocfig="P4502792350366-FIG017" label="36"/>
      </nsnindxrow>
      <nsnindxrow>
         <nsn>
            <fsc>6145</fsc>
            <niin>00-013-8651</niin>
         </nsn>
         <callout assocfig="P4505792350366-FIGBULK" label="42"/>
      </nsnindxrow>
      <nsnindxrow>
         <nsn>
            <fsc>5310</fsc>
            <niin>00-014-5850</niin>
         </nsn>
         <callout assocfig="P4500292350366-FIG001" label="17"/>
          <callout assocfig="P4500892350366-FIG007" label="30"/>
          <callout assocfig="P4501892350366-FIG046" label="7"/>
        <callout assocfig="P4502292350366-FIG032" label="9"/>
      </nsnindxrow>
      <nsnindxrow>
         <nsn>
            <fsc>5310</fsc>
            <niin>00-045-3296</niin>
         </nsn>
         <callout assocfig="P4503892350366-FIG027" label="19"/>
      </nsnindxrow>
   </nsnindx>

What I have so far is:

    <xsl:template match="nsnindx">
       <nsnindx>
        <xsl:for-each select="child::nsnindxrow">
            
                <xsl:variable name="full_NSN">
                    <xsl:value-of 
select="concat(descendant::fsc,descendant::niin)"/>
                </xsl:variable>
                 <xsl:choose>
                     <xsl:when test="$full_NSN = 
concat(following-sibling::nsnindxrow[1]/descendant::fsc,following-sibling::nsnindxrow[1]/descendant::niin)">
                        <nsnindxrow>
                            <xsl:copy-of select="child::nsn"/>
                            <xsl:copy-of select="child::callout"/>
                          <xsl:copy-of 
select="following-sibling::nsnindxrow[1]//callout"/>
                        </nsnindxrow>
                    </xsl:when>
                     <xsl:when test="$full_NSN = 
concat(following-sibling::nsnindxrow[1]/descendant::fsc,preceding-sibling::nsnindxrow[1]/descendant::niin)"/>
                     <xsl:otherwise>
                         <nsnindxrow>
                            <xsl:copy-of select="child::nsn"/>
                            <xsl:copy-of select="child::callout"/>
                         </nsnindxrow>
                     </xsl:otherwise>
            </xsl:choose>
            
        </xsl:for-each>
        </nsnindx>
    </xsl:template>

This work fine if there are only two successive entries where the NSNs match. 
However, there can certainly be more than two in a row that match (see input). 
How do I progess through each <nsnindxrow>, rebuild the row, until the matching 
stops?

Thanks.

C Flanders




--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

<Prev in Thread] Current Thread [Next in Thread>