|
Subject: RE: [xsl] loop timing and result-document flush From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Wed, 2 May 2007 18:12:48 +0100 |
Could I attempt a summary?
Firstly, as David C pointed out, for-each is not a loop. Think of it as
processing all the items in parallel, even if the implementation chooses to
do it sequentially.
Secondly, you're not allowed to read a document that was written earlier in
the transformation. That applies to doc-available() just as much as to
doc().
Thirdly, and this has also been said already, though perhaps not very
clearly: your problem description essentially says that you are eliminating
duplicates, and the right tools for that job in XSLT 2.0 are
distinct-values() and xsl:for-each-group.
Fourthly, your strategy doesn't work because doc-available() is defined to
be stable. Once you've called doc-available('abc.xml') and have received the
answer "false", the system is obliged to continue returning the answer false
if you call the function again with the same argument. [That's the way it is
supposed to work. To be honest, I'm pleasantly surprised Saxon is getting
this right, and I wouldn't guarantee that it will do so in all
circumstances!]
Michael Kay
http://www.saxonica.com/
> -----Original Message-----
> From: Duane Gran [mailto:dmg2n@xxxxxxxxxxxx]
> Sent: 02 May 2007 15:06
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] loop timing and result-document flush
>
> XSL experts,
>
> I have an XSL which loops over a set of elements in search of
> links and creates a result document for the link. In some
> cases there is more than one link to the same anticipated
> document, so I use the doc-
> available() to test first for its existence before creating
> the file. This is intended to avoid a DynamicError related
> to writing more than one result document to the same URI.
>
> However, when I run the program against a large set of
> documents after 10 minutes or so I get the DynamicError.
> Below is the output (run via ant) along with some debugging
> fields I'll explain in a moment:
>
> [xslt] test for doc /Users/dgran/dev/rose/build/zoom/
> 1-1861.wrenn.320-321.img.html available: false
> [xslt] creating file: /Users/dgran/dev/rose/build/
> zoom/1-1861.wrenn.320-321.img.html
>
> [xslt] test for doc /Users/dgran/dev/rose/build/zoom/
> 1-1861.wrenn.320-321.img.html available: false
> [xslt] creating file: /Users/dgran/dev/rose/build/
> zoom/1-1861.wrenn.320-321.img.html
>
> [xslt] Failed to process /Users/dgran/dev/rose/deploy.temporary/
> 1-1861.wrenn.rad.xml
>
> BUILD FAILED
> /Users/dgran/dev/rose/build.xml:395: The following error
> occurred while executing this line:
> /Users/dgran/dev/rose/build.xml:77: net.sf.saxon.trans.DynamicError:
> Cannot write more than one result document to the same URI:
> file:/ Users/dgran/dev/rose/build/zoom/1-1861.wrenn.320-321.img.html
>
> In the first case, the file (1-1861.wrenn.320-321.img.html)
> is correctly created because it doesn't exist yet. In the
> second case the doc-available() method should return true and
> skip the result- document command, but it fails to work. My
> hypothesis is that the
> result-document() method isn't finished flushing before the call to
> doc-available() is made.
>
> Assuming my guess is correct, is there a way in XSL to assure
> that the document is finished writing before continuing to
> the next iteration in the loop? Maybe there is another way
> of skinning this cat. I welcome suggestions. I'm using
> Saxon 8-7-3j. Below is a simplified version of my stylesheet:
>
> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> version="2.0">
> <xsl:template match="/">
> <xsl:for-each select="ram|//repro|//page|//figure">
> <xsl:variable name="zoomhtml">
> <xsl:text>build/zoom/</xsl:text>
> <xsl:value-of select="@image"/>
> <xsl:text>.img.html</xsl:text>
> </xsl:variable>
> <xsl:message>
> test for doc <xsl:value-of select="$zoomhtml"/> available:
> <xsl:value-of select="doc-available($zoomhtml)"/>
> </xsl:message>
> <xsl:choose>
> <xsl:when test="doc-available($zoomhtml)"/>
> <xsl:otherwise>
> <xsl:message> creating file: <xsl:value-of
> select="$zoomhtml"/>
> </xsl:message>
> <xsl:result-document href="$zoomhtml">
> </xsl:result-document>
> </xsl:otherwise>
> </xsl:choose>
> </xsl:for-each>
> </xsl:template>
> </xsl:stylesheet>
>
> Duane Gran
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] loop timing and result-do, Abel Braaksma | Thread | RE: [xsl] loop timing and result-do, cknell |
| RE: [xsl] Help moving away from nam, Michael Kay | Date | RE: [xsl] Transformation with respe, Michael Kay |
| Month |