Subject: RE: [xsl] Calling mutator java method (date fields to seconds-since-epoch with java.util.GregorianCalendar) From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Tue, 22 Aug 2006 13:19:50 +0100 |
> Flipping through Appendix B of MK's XSLT 2.0 book, my best > guess would be to create two > dateTimes: one with my string date fields and one of 1970. > Then I could use subtract-dates/dateTimes... to get an > xdt:*Duration. But if I had the duration, how would I convert > it into the number of seconds? <xsl:variable name="origin" select="xs:dateTime('1970-01-01T00:00:00')"/> <xsl:variable name="one-ms" select="xs:dayTimeDuration('PT0.001S')"/> <xsl:function name="f:milliseconds-since-origin" as="xs:integer"> <xsl:param name="in" as="xs:dateTime"/> <xsl:sequence select="xs:integer(($in - $origin) div $one-ms)"/> </xsl:function> Seem a lot simpler than the Java GregorianCalendar class... Michael Kay http://www.saxonica.com/ > > Despite my best efforts, I have not found a reasonable > introduction to the xs/xdt typing system. Does anyone have > any suggestions for references? > > Regards, > Tim > > On 8/22/06, Michael Kay <mike@xxxxxxxxxxxx> wrote: > > The way extension functions work is to a large extent > > implementation-defined, so it's fairly meaningless to ask questions > > about them without saying what XSLT processor you are using. > > > > In general, though, calling extension functions with > side-effects is > > likely to be problematic, as the calls can easily be optimized away. > > > > If this is Saxon, for example, a variable that's never > referenced will > > never be evaluated. And variables that are used will usually be > > evaluated in a different order from the order in which they > are declared. > > > > With Saxon you can usually ensure that a void extension function is > > called by including the call in an xsl:value-of instruction that is > > writing to the result tree. Saxon deliberately avoids > looking at the > > function signature to discover that the method always returns void, > > instead treating it as if the returned result might be significant. > > > > But if you're using Saxon, why not do the calculation in XPath? > > > > Michael Kay > > http://www.saxonica.com/ > > > > > > > -----Original Message----- > > > From: Tim Lebo [mailto:timleboxslt@xxxxxxxxx] > > > Sent: 22 August 2006 02:35 > > > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > > > Subject: [xsl] Calling mutator java method (date fields to > > > seconds-since-epoch with java.util.GregorianCalendar) > > > > > > Hello, > > > > > > I need to determine the number of seconds past the epoch > given the > > > year, month, day, hour, and minute fields (as strings). > > > > > > This can be done with the java.util.GregorianCalendar class using > > > the > > > set(year,month,day,hour,minute) mutator and calling the > > > getTimeInMillis() accessor. I have been able to > demonstrate this in > > > a sample main class that uses GregorianCalendar: > > > > > > // For year,month,day,hour,min -> seconds > > > since epoch > > > import java.util.Calendar; > > > import java.util.GregorianCalendar; > > > > > > public class MyDate { > > > > > > public static void main(String args[]) { > > > Calendar myCal = new > > > GregorianCalendar(); > > > myCal.set(2006,7,21,13,26,0); > > > //1156181207 > > > > > > System.out.println(myCal.getTimeInMillis()/1000 - 1156181207); > > > } > > > > > > } > > > > > > > > > The following xslt shows how I instantiate a > GregorianCalendar. Two > > > outputs are obtained: > > > 1) A failed attempt to get the seconds-since-the-epoch > after the set > > > method call > > > 2) The objects toString, which shows that the date information is > > > actually the time of execution and not the date set > > > > > > This leads me to believe that the mutator call did not > 'take effect'. > > > Looking to previous java-interaction solutions that I > have created, > > > I notice that this is the first time I am calling an object's > > > mutator method, which returns void. Does this need to be handled > > > differently? > > > > > > Regards, > > > Tim > > > > > > > > > > > > <xsl:transform version="2.0" > > > > > > xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > > > > > > xmlns:xfm="transform namespace" > > > > > > > > xmlns:xs="http://www.w3.org/2001/XMLSchema" > > > > > > > > xmlns:cal="java:java.util.GregorianCalendar" > > > exclude-result-prefixes="xfm xs"> > > > > > > <xsl:output method="text"/> > > > > > > > > > > > > <xsl:template match="/"> > > > > > > <xsl:variable name="start" select="cal:new()"/> > > > > > > <xsl:variable name="start-set" > > > select="cal:set($start,xs:integer('2006'), > > > > > > > > > > > > > > > xs:integer('7'),xs:integer('21'), > > > > > > > > > > > > > > > > > > xs:integer('13'),xs:integer('26'),xs:integer('0'))"/> > > > > > > <xsl:value-of select="concat('expecting > seconds-since-epoch of > > > 2006 > > > 21 Aug at 13:26:00, but getting current > seconds-since-epoch: ',$NL, > > > > > > > > > xs:integer(cal:getTimeInMillis($start)) > > > div xs:integer('1000'),$NL,$NL)"/> > > > > > > <xsl:value-of select="concat('toString indicates > that the call > > > to set the date was not recognized (See > > > DAY_OF_MONTH,HOUR_OF_DAY...):',$NL, > > > > > > cal:toString($start),$NL)"/> > > > > > > </xsl:template> > > > > > > > > > > > > <xsl:variable name="NL"> > > > > > > <xsl:text> > > > > > > </xsl:text> > > > > > > </xsl:variable> > > > > > > > > > > > > </xsl:transform>
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Calling mutator java meth, David Carlisle | Thread | Re: [xsl] Calling mutator java meth, David Carlisle |
Re: [xsl] recursive template call, , Sam Carleton | Date | Re: [xsl] spirit an xml element awa, Frank Marent |
Month |