I need a loop up to a specific node position() and sum of these nodes. For example:
- if my position is 2 then node[1] + node[2]
- if my position is 5 then node[1] + node[2] + node[3] + node[4] + node[5]
How can that be done in XSLT?
do have following xml
<?xml-stylesheet type="text/xsl" href="sum.xsl"?><root><FIDetail Node1="5" Node2="2" Node3="9" Node4="5" Node5="1" Node6="6" Node7="5" Node8="5" Node9="12" Node10="6" Node11="4" Node12="8" Node13="4" Node14="6" Node15="5" Node16="6" Node17="2" Node18="7" Node19="4" Node20="5" Node21="4" Node22="6" Node23="4" Node24="11" Node25="5" Node26="1" Node27="7" Node28="1" Node29="4" Node30="2" Node31="5" Node32="2" Node33="6" Node34="4" Node35="7" Node36="7" Node37="9" Node38="10" Node39="3" Node40="8" Node41="8" Node42="5" Node43="5" Node44="2" Node45="5" Node46="12" Node47="9" Node48="14" Node49="18" Node50="1"/></root>
i am trying to show output as below
5 sum of Node1
7 sum of Node1 + Node2
16 sum of Node1 + Node2 + Node3
…. sum of Node1 + … + Node50
any one please help me that what will be XSL
not working xsl is as below
<?xml version="1.0" encoding="UTF-8"?>
<xsl:for-each select="//FIDetail/@*">
<br/>
<xsl:value-of select="sum(preceding-sibling::*) + ."/>
=
<xsl:for-each select="preceding-sibling::*">
<xsl:value-of select="name()"/> +
</xsl:for-each>
<xsl:value-of select="name()"/>
</xsl:for-each>
</xsl:template>
You may be able to cobble together a solution that appears to work, but there’s an inherent problem, and your solution is going to break.
The problem is that attributes in XML don’t have significant order. You can’t rely on attributes being presented to any process, in or out of XSLT, in the same order they appear in the text. Frankly, I’m surprised that XSLT even allows you to use
position()in an attribute predicate.(Incidentally, this is the reason that the identity transform uses that odd pattern
select="node()|@*". The@*is required becausenode()doesn’t match attributes.node()doesn’t match attributes because attributes aren’t nodes. Nodes have position, and attributes don’t.)If your application depends on the ordering of attributes, it’s broken and you need to redesign it.
There’s a way out, though, if you can rely on the attributes’ names to provide some kind of ordering, as shown in your example:
Is that ugly? You bet. And it breaks if you ever change your attribute naming scheme in the slightest. But it’ll work however the attributes are ordered.