Subject: [xsl] comparing following nodes and re-structuring. From: charlieo0@xxxxxxxxxxx Date: Tue, 6 Dec 2011 14:17:12 +0000 (UTC) |
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
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Dealing mixed content wit, David Carlisle | Thread | Re: [xsl] comparing following nodes, Andrew Welch |
Re: [xsl] Re: Dealing mixed content, David Carlisle | Date | Re: [xsl] comparing following nodes, Andrew Welch |
Month |