How to use xsl:for-each
in xslt to get value iteratively from an xml file and to dispaly it in table fromat
For example: the xml file is like
<order>
<item name ="a"/>
<item name ="b"/>
<item name ="c"/>
<item name ="d"/>
<item name ="e"/>
<item name ="f"/>
<item name ="g"/>
</order>
and the output should be
a b c d
e f g
the loop should count the item and if it is divisble by 4 it
should close the current row and add a new row and so on..
i'm using the following xslt for this
but i can not display it in table format
<xsl:template match="/">
<html>
<body>
<xsl:call-template name ="incr">
<xsl:with-param name ="value">1</xsl:with-param>
<xsl:with-param name ="limit">
<xsl:value-of select ="count(//item)"/>
</xsl:with-param>
</xsl:call-template>
</body>
</html>
</xsl:template >
<xsl:template name="incr">
<xsl:param name="value"/>
<xsl:param name ="limit"/>
<xsl:if test ="$value!=$limit+1">
<xsl:value-of select ="//item[$value]/@name"/>
<xsl:if test ="$value mod 4 =0">
<br/>
<br/>
</xsl:if>
<xsl:call-template name ="incr">
<xsl:with-param name ="value" select ="$value+1"/>
<xsl:with-param name ="limit" select ="$limit"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
please help me to do this
Thanks in advance
In case of XSLT 1.0, you need to use a recursive template that will keep track of the cumulative value of product ( item_price * gst ) for the repeating <item> node. In case of XSLT 2.0, it is acceptable to use sum(item/(item_price * gst)) expression for computing the sum of the products.
Anyway, for a start, I would suggest to use <xsl:variable name="listData" select="met:getData($Id)"/> , that is all you can do on the XSLT side to bind the variable to the result from the function call, your current attempt makes the variable hold a tree fragment containing a text node with the string value of the ...
The <xsl:for-each> element allows you to do looping in XSLT.
XSLT for each is defined as the iteration process that allows retrieving data from the specified nodes. Based on the selection criteria defined with these functions, it makes a loop through multiple nodes. This works in adding up with the function <xsl:value-of>.
This transformation:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="vNumCols" select="4"/>
<xsl:template match="/*">
<table>
<xsl:for-each select=
"item[position() mod $vNumCols = 1]">
<tr>
<xsl:for-each select=
". | following-sibling::*
[not(position() >= $vNumCols)]">
<td><xsl:value-of select="@name"/></td>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
when applied on the provided XML document, produces the desired correct results:
<table>
<tr>
<td>a</td>
<td>b</td>
<td>c</td>
<td>d</td>
</tr>
<tr>
<td>e</td>
<td>f</td>
<td>g</td>
</tr>
</table>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With