Subject: RE: 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: 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
|