RE: [xsl] loop timing and result-document flush

Subject: RE: [xsl] loop timing and result-document flush
From: cknell@xxxxxxxxxx
Date: Wed, 02 May 2007 10:22:20 -0400
We can't infer very much about the structure of your input document from the XSL you show. You appear to be trying to force a procedural style of programming onto a functional programming model (note how you are using xsl:for-each)

If we could see the structure of your input document, we could almost certainly show you a simple, functional (rather than procedural), XSL-like method of solving your problem.
-- 
Charles Knell
cknell@xxxxxxxxxx - email



-----Original Message-----
From:     Duane Gran <dmg2n@xxxxxxxxxxxx>
Sent:     Wed, 2 May 2007 10:05:55 -0400
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