xsl-list
[Top] [All Lists]

Re: [xsl] How to output the start execution time and the end execution time?

2014-09-06 12:10:04
Dimitre,

given that the call to an external timepiece delivers the wallclock time:
how can one be sure that a call near the top of the  XSLT program is
executed first, e.g., before accessing the main document? And how can one
be sure that a call near the end of the program is the last thing the
program does, e.g., even after writing/serializing everything and flushing
all buffers?

Not really knowing what one measures? Not being sure how the data
influences the result?

-W



On 6 September 2014 18:31, Abel Braaksma (Exselt) abel(_at_)exselt(_dot_)net <
xsl-list-service(_at_)lists(_dot_)mulberrytech(_dot_)com> wrote:

Hi Roger,

Functions and constructs in XSLT and XPath are stable (barring a few
exceptions). Calling a function with the same argument twice will yield the
same result for both calls. The functions current-time(),
current-dateTime() and current-date() will therefor always return the same
time (with a slight caveat for static and dynamic evaluation phases, but
let's not digress).

The only way out here is extension functions, or a trick with XSLT 3.0
using streaming, because the xsl:stream instruction is deemed non-stable
(i.e., it will re-invoke the url at the href argument each time it is
called). Whether an extension function helps depends whether your processor
allows non-stable extension functions, but I believe most, if not all,
processors do.

Here's a (workable) trick that works with all XSLT 3.0 processors, however
you might want to choose a local resource instead that returns the current
date-time, for performance reasons.


<xsl:mode streamable="yes" name="time" on-no-match="shallow-skip" >

<!-- may need an actual argument to force re-evaluation -->
<xsl:function name="my:current-time">
  <xsl:stream href="http://time.is";>
    <xsl:apply-templates mode="time" />
  </xsl:stream>
</xsl:function>

<!-- match the element that contains the time -->
<xsl:template match="div[@id = 'twd']">
    <xsl:value-of select="." />
</xsl:template>

<xsl:template match="/">
     <xsl:value-of select="my:current-time()" />
     ... do the processing ...
     <xsl:value-of select="my:current-time()" />
 </xsl:template>


Note: the page http://time.is currently does not deliver proper XML (and
on my search for a time server that did deliver proper XML or even proper
XHTML I did not find any). If you can convince your processor not to cache
the result of unparsed-text, you can use the following with the same server
as a workaround (ugly, but it shows the principle):

<xsl:value-of select="replace(unparsed-text('http://time.is/'),
'.+twd&quot;&gt;([^&lt;]+).*', '$1', 'sm')" />

Cheers,
Abel


-----Original Message-----
From: Costello, Roger L. costello(_at_)mitre(_dot_)org [mailto:xsl-list-
service(_at_)lists(_dot_)mulberrytech(_dot_)com]
Sent: Saturday, September 06, 2014 11:47 AM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] How to output the start execution time and the end
execution
time?

Hi Folks,

I would like to:

1. Output the time that my XSLT program starts processing 2. Do the
processing 3. Output the time that my XSLT program finishes processing

This doesn't work:

    <xsl:template match="/">
        <xsl:value-of select="current-time()" />
        ... do the processing ...
        <xsl:value-of select="current-time()" />
    </xsl:template>

What is the correct way to accomplish this?

/Roger



--~----------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
EasyUnsubscribe: http://lists.mulberrytech.com/unsub/xsl-list/1167547
or by email: xsl-list-unsub(_at_)lists(_dot_)mulberrytech(_dot_)com
--~--
<Prev in Thread] Current Thread [Next in Thread>