[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

RE: [xsl] conditional multiple outputs


Subject: RE: [xsl] conditional multiple outputs
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Thu, 14 May 2009 12:13:52 +0100

You might be interested that this problem is one of the use cases the XSL WG
is studying in its work on streaming: how to generate multiple output files
from a single input file processed in a single pass. We refer to it as the
"coloured widget" problem based on the way it was originally expressed by
Oliver Becker. (Who, like three-and-a-half of the contributors so far to
this thread, happens to be German. Odd coincidence.)

Regards,

Michael Kay
http://www.saxonica.com/
http://twitter.com/michaelhkay
 

> -----Original Message-----
> From: drame@xxxxxxxxxxxxxxxxxxxxxxx 
> [mailto:drame@xxxxxxxxxxxxxxxxxxxxxxx] 
> Sent: 14 May 2009 11:36
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] conditional multiple outputs
> 
> Hi,
> 
> I am trying to generate multiple output files in a single 
> template (see xsl file below). The scenario is the following:
> 
> 1. I read elements <title> one after the other from a input 
> file "content.xml"
> 2. if the text of the element <title> begins with the 
> substring "file 1", then copy the element to the output file 
> file1.xml, if it begins with "file 2" then output to 
> file2.xml, else copy the element to file3.xml.
> 
> The processor I use is Saxon B on .NET and XLST version is 
> 2.0. But my script does not work since I always have 
> following error message:
> 
> E:\test\xsl>Transform -s:"e:\test\xsl\content.xml"
> -xsl:"e:\test\xsl\import.xsl
> Error at xsl:choose on line 8 of file:///e:/test/xsl/import.xsl:
>   XTDE1490: Cannot write more than one result document to the 
> same URI, or write to a URI
>   that has been read: file:/E:/test/xsl/file2.xml 
> Transformation failed: Run-time errors were reported
> 
> 
> 
> Here are the script and the input file content.xml:
> 
> <!--content.xml-->
> <?xml version="1.0" encoding="UTF-8"?>
> <groups>
>         <group>
>                 <title>file 1 xxx </title>
>                 <title>file 2 efg </title>
>         </group>
>         <group>
>                 <title>file 2 xxx </title>
>                 <title>file 3 abc </title>
>         </group>
>         <group>
>                 <title>file 1 abc </title>
>                 <title>file 3 xyz </title>
>         </group>
>         <group>
>                 <title>file 2 zzz </title>
>                 <title>file 2 ihk </title>
>         </group>
> </groups>
> 
> 
> 
> <!--multipleOutput.xsl-->
> <?xml version="1.0"?>
> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> version="2.0">
>         <xsl:output method="xml" indent="yes" encoding="utf-8"/>
>         <xsl:template name="test" match="/">
>                 <xsl:for-each select="groups/group">
>                         <xsl:for-each select="title">
>                                 <xsl:variable 
> name="textOfTheElementTitle"
> select="substring(./text(), 1, 6)"/>
>                                 <xsl:choose>
>                                         <xsl:when 
> test="matches($textOfTheElementTitle,
> 'file 1', 'i')">
>                                                 
> <xsl:result-document href="file1.xml">
>                                                         
> <contentOfTitleElmt>
>                                                               
>   <xsl:value-of select="./text()"/>
>                                                         
> </contentOfTitleElmt>
>                                                 </xsl:result-document>
>                                         </xsl:when>
>                                         <xsl:when 
> test="matches($textOfTheElementTitle,
> 'file 2', 'i')">
>                                                 
> <xsl:result-document href="file2.xml">
>                                                         
> <contentOfTitleElmt>
>                                                               
>   <xsl:value-of select="./text()"/>
>                                                         
> </contentOfTitleElmt>
>                                                 </xsl:result-document>
>                                         </xsl:when>
>                                         <xsl:otherwise>
>                                                 
> <xsl:result-document href="file3.xml">
>                                                         
> <contentOfTitleElmt>
>                                                               
>   <xsl:value-of select="./text()"/>
>                                                         
> </contentOfTitleElmt>
>                                                 </xsl:result-document>
>                                         </xsl:otherwise>
>                                 </xsl:choose>
>                         </xsl:for-each>
>                 </xsl:for-each>
>         </xsl:template>
> </xsl:stylesheet>
> 
> Does somebody know why it does not work? Should I use another 
> function than xsl:result-document?
> 
> Many thanks in advance,
> Regards
> 
> Horace


Current Thread
Keywords
xsl