xsl-list
[Top] [All Lists]

Frustrated by result-document

2004-06-06 05:29:33
I've had a lot of fun learning XSLT, and it's mostly been straightforward but 
was surprised to find
that result-document appears only to update a file once. This with Saxon 7.9.1.

I have an input that suggests files to update, and often this results in files 
needing multiple
updates.

Using a <for-each input, update the result-document suggested in the current 
input>, I find only the
last update is being made.

I'm taking this to suggest the result-document isn't releasing a new file at 
</result-document>.

I'm worried about the prospect of having to internalise all the files to then 
find all the updates
needed for each file, so as to generate just one update per file. Am I going to 
have to do this, or
is there a better
approach?.. I have looked to read around this but not found anything explicitly 
suggesting this
behaviour.

Regards
davidpbrown

Example of the problem
The transform below acting on this input
<?xml version="1.0" encoding="utf-8"?>
<data>
<item name="x" id="136">item1</item>
<item name="y" id="137"/>
<item name="z" id="138">item3</item>
</data>


I would hope to give this output
<?xml version="1.0" encoding="utf-8"?>
<data>
<item name="newinput" id="136">newinput2</item>
<item name="newinput" id="136">newinput1</item>
<item name="x" id="136">item1</item>
<item name="y" id="137"/>
<item name="z" id="138">item3</item>
</data>

but instead gives
<?xml version="1.0" encoding="utf-8"?>
<data>
<item name="newinput" id="136">newinput2</item>
<item name="x" id="136">item1</item>
<item name="y" id="137"/>
<item name="z" id="138">item3</item>
</data>


The simplified transform that highlights my problem is..
<?xml version="1.0"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; version="2.0">
<xsl:output method="xml" indent="no" encoding="utf-8"/>

<xsl:template match="/">
 <xsl:variable name="files">
 <file>data.xml</file>
 <file>data.xml</file>
 </xsl:variable>

 <xsl:for-each select="$files/file">
  <xsl:variable name="position" select="position()"/>
  <xsl:variable name="filename" select="concat('file:///C:/xslttest/',.)"/>
  <xsl:choose>
   <xsl:when test="document($filename)">
   <xsl:variable name="input"><xsl:copy-of
select="document($filename)/data/*"/></xsl:variable>

<xsl:message><xsl:copy-of select="$input/item/*"/></xsl:message>

  <xsl:result-document href="{$filename}">
   <xsl:text>&#10;</xsl:text>
   <data>
    <xsl:text>&#10;</xsl:text>
    <item name="newinput" id="136">newinput<xsl:value-of
select="$position"/></item>
    <xsl:for-each select="$input/child::*">
     <xsl:text>&#10;</xsl:text>
     <xsl:copy-of select="."/>
    </xsl:for-each>
    <xsl:text>&#10;</xsl:text>
   </data>
  </xsl:result-document>

  </xsl:when>
  <xsl:otherwise>
  <xsl:message>error</xsl:message>
  </xsl:otherwise>
  </xsl:choose>
 </xsl:for-each>
</xsl:template>

<xsl:template match="text()|@*"/>
</xsl:transform>




<Prev in Thread] Current Thread [Next in Thread>