mysacramento Posted August 7, 2006 Share Posted August 7, 2006 Hello,I want to ask you guys a solution in XSLT about how to consolidate several same XML nodes into one. For instance:<xsl:template name="details"><details><xsl:for-each select="detail"><xsl:sort select="A/@app"/><xsl:sort select="A/@id"/><xsl:sort select="A/@part"/><xsl:sort select="A/@factor"/><xsl:sort select="A/@inc"/><xsl:call-template name = "copydetail"/></xsl:for-each></details></xsl:template>Instead <xsl:call-template name = "copydetail"/> which copy the current node into the <detail> node I would like to update the same node if already exist in the <detail>. Is it possible?Unfortunately I can't use the position() function because of the sorting, how can I keep track of the last processed node? I guess my logic will say if processed node = current node then update processed node, otherwise write (output) the processed node because I won't find any more of this nodes in my file (because of the sorting). Using key() instead the sort works too but I have the same problem, how can I group all of the nodes in my key into one single node? Maybe with 2 steps transformation process?Hope I could explained the problem clear enough.Thanks. Link to comment Share on other sites More sharing options...
boen_robot Posted August 9, 2006 Share Posted August 9, 2006 I didn't quite catch the deal here, but they again, I might not need to. How about something like: <xsl:template name="details"><details><xsl:apply-templates select="detail"><xsl:sort select="A/@app"/><xsl:sort select="A/@id"/><xsl:sort select="A/@part"/><xsl:sort select="A/@factor"/><xsl:sort select="A/@inc"/></xsl:apply-templates></details></xsl:template><xsl:template match="detail"><!--The stuff you needed to use position() for. You can use it here.--><xsl:call-template name="detail"/></xsl:template>> Note: It might be even better if the template called "detail" is actually in the matched "detail" template. Link to comment Share on other sites More sharing options...
mysacramento Posted August 9, 2006 Author Share Posted August 9, 2006 I didn't quite catch the deal here, but they again, I might not need to. How about something like:<xsl:template name="details"><details><xsl:apply-templates select="detail"><xsl:sort select="A/@app"/><xsl:sort select="A/@id"/><xsl:sort select="A/@part"/><xsl:sort select="A/@factor"/><xsl:sort select="A/@inc"/></xsl:apply-templates></details></xsl:template><xsl:template match="detail"><!--The stuff you needed to use position() for. You can use it here.--><xsl:call-template name="detail"/></xsl:template>> Note: It might be even better if the template called "detail" is actually in the matched "detail" template. Thank you very much for your response. The proposed code is actually a better interpretation of my current code, probably more efficient too. However I still have the original problem:Let me show you a practical example of what I'm trying to accomplish by listing an input XML and the aspected result:Input XML (original):<detailsection> <detail> <item name="tagged">false</item> <A app="x" id="00401" part="1" factor="0" inc="Some text"> <B> <item name="value">1</item> </B> </A> </detail> <detail> <item name="tagged">false</item> <A app="x" id="99991" part="0" factor="0" inc="Some text"> <B> <item name="value">900</item> </B> </A> </detail> <detail> <item name="tagged">false</item> <A app="x" id="00401" part="1" factor="0" inc="Some text"> <B> <item name="value">100</item> </B> </A> </detail></detailsection> Output XML (after transformation): <detailsection> <detail> <item name="tagged">false</item> <A app="x" id="00401" part="1" factor="0" inc="Some text"> <B> <item name="value">101</item> </B> </A> </detail> <detail> <item name="tagged">false</item> <A app="x" id="99991" part="0" factor="0" inc="Some text"> <B> <item name="value">900</item> </B> </A> </detail></detailsection> The output result should combine the 1st and 3rd node together since they are the same. By "combine" I mean keeping the <datail> node the same except for the <item name="value"> that will report the total of the 2 nodes combined together (1 + 100). If later I find some more node that match node #1 (or #2 for that matter) I would like to update the existing <item name="value"> value. Any idea about how to approch this problem during the XML transformation process (XSLT or other techniques)?Thank you very much for your advices. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now