Global Variable in XSL
http://stackoverflow.com/questions/9608432/incrementing-and-checking-the-counter-variable-in-xsltCannot increment a variable in XSLT because all XSLT variables are constant. There are, however, several methods available for accomplishing this task:
1. Use a recursive <xsl:call-template> element passing the value of $noOfElements+1 as a param to the template.
2. Use an XSLT extension such as Java or JavaScript and set an xsl:variable equal to an instance of an object. Even though XSL variable's are constant, the data contained within an instance variable such as a Java Integer or a Java StringBuffer can be modified. In other words, you can not change the object referenced by the XSL variable (set the variable to a different Java object), but you can change the data members of the object referenced by that variable.
Sample Input File ============= <Foo> <Bar>Line 1</Bar> <Bar>Line 2</Bar> <Bar>Line 3</Bar> <Bar>Line 4</Bar> <Bar>Line 5</Bar> <Bar>Line 6</Bar> </Foo> Sample XSLT ========== <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:xalan='http://xml.apache.org/xslt' xmlns:java="http://xml.apache.org/xslt/java" extension-element-prefixes="" exclude-result-prefixes="xsl xalan java" version="1.0"> <!-- define the output parameters --> <xsl:output method='xml' version='1.0' encoding='UTF-8' omit-xml-declaration='no' indent='yes' xalan:indent-amount='4' /> <!-- Declare my counter variable here --> <xsl:variable name="javaCounter" select="java:java.util.ArrayList.new()"/> <xsl:template match="/Foo"> <Foo> <xsl:for-each select="./Bar"> <!-- increment the Counter , ie. add item to the ArrayList object --> <xsl:variable name="Foo" select="java:add($javaCounter, '1')"/> <Bar><xsl:value-of select="."/></Bar> <!-- ask for the size of the ArrayList --> <Counter><xsl:value-of select="java:size($myCounter)"/></Counter> </xsl:for-each> </Foo> </xsl:template> </xsl:stylesheet> Output File ========= <?xml version="1.0" encoding="UTF-8"?> <Foo> <Bar>Line 1</Bar><Counter>1</Counter> <Bar>Line 2</Bar><Counter>2</Counter> <Bar>Line 3</Bar><Counter>3</Counter> <Bar>Line 4</Bar><Counter>4</Counter> <Bar>Line 5</Bar><Counter>5</Counter> <Bar>Line 6</Bar><Counter>6</Counter> </Foo>
Namespace can be defined as following
xmlns:date="java:java.util.Date"
xmlns:array="java:java.util.ArrayList"
Clear Array
java:clear($javaCounter)
Java with XSL
http://cafeconleche.org/books/xmljava/chapters/ch17s03.html
Reference
http://xml.apache.org/xalan-j/extensions.htmlhttp://cafeconleche.org/books/xmljava/chapters/ch17s03.html
http://mail-archives.apache.org/mod_mbox/xml-xalan-j-users/200605.mbox/%3C53cb81ac0605031612s37b76138q397144a782586170@mail.gmail.com%3E
0 comments:
Post a Comment