|
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 |