Jump to content

Consolidate same nodes into one


mysacramento

Recommended Posts

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

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

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...