Today, I am here to show you how to automatically create xml element use XSLT, out target is base on input parameters (startdate and enddate) then print out all the dates in between.
for example:
Parameters :
startDate = 03/20/2011
endDate-03/26/2011
Target XML Result:
<result>
<day>03/20/2011</day>
<day>03/21/2011</day>
<day>03/22/2011</day>
<day>03/23/2011</day>
<day>03/24/2011</day>
<day>03/25/2011</day>
<day>03/26/2011</day>
<result>
Skill:
We will use recursive way to implement dynamic create xml element and use javascript to compare the date and add day.
Code:
<?xml version="1.0"?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:user="my-utility-function"
>
<xsl:template match="/">
<xsl:element name="result">
<xsl:call-template name="for.loop">
<xsl:with-param name="startDate">03/20/2011</xsl:with-param>
<xsl:with-param name="endDate">03/26/2011</xsl:with-param>
</xsl:call-template>
</xsl:element>
</xsl:template>
<xsl:template name="for.loop">
<xsl:param name="startDate" />
<xsl:param name="endDate" />
<xsl:if test="user:CompareDate(string
($startDate),string
($endDate))='1'">
<xsl:element name="day"><xsl:value-of select="$startDate" /></xsl:element>
</xsl:if>
<!--begin_: Resursive -->
<xsl:if test="user:CompareDate(string($startDate),string($endDate))='1'">
<xsl:call-template name="for.loop">
<xsl:with-param name="startDate"> <xsl:value-of select="user:AddDate(string($startDate),1)"/> </xsl:with-param>
<xsl:with-param name="endDate"> <xsl:value-of select="$endDate"/></xsl:with-param>
</xsl:call-template>
</xsl:if>
</xsl:template>
<msxsl:script language="javascript" implements-prefix="user">
<![CDATA[
function CompareDate(a,b)
{
var dateArray = a.split("/");
var d=new Date(dateArray[2], dateArray[0], dateArray[1]);
var dateArray2 = b.split("/");
var d2=new Date(dateArray2[2], dateArray2[0], dateArray2[1]);
if(d>d2)
{
return "0";
}
return "1";
}
function AddDate(a,b)
{
var dateArray = a.split("/");
var d=new Date(dateArray[2], dateArray[0], dateArray[1]);
var curr_date = d.getDate();
var curr_month = d.getMonth();
curr_date++;
var curr_year = d.getFullYear();
return(curr_month + "/" + curr_date + "/" + curr_year);
}
]]>
</msxsl:script>
</xsl:stylesheet>