Subject: RE: Need to output an opening or closing tag by itself
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Wed, 25 Jun 2008 10:34:22 +0100
|
The output of a transformation is a tree of nodes. It is not lexical XML
containing angle-bracket tags - those are produced from the result tree by
the serializer. Creating a node on the result tree is an atomic operation,
you can't create half a node.
The problem you are tackling is called positional grouping, In XSLT 2.0 you
can often tackle it using <xsl:for-each-group>. In 1.0 an appropriate
technique is often sibling recursion, where you process a sequence of
siblings one-by-one in a recursive template. You should be able to find
these techniques using a google search.
Michael Kay
http://www.saxonica.com/
> -----Original Message-----
> From: David Frey [mailto:dpfrey@xxxxxxx]
> Sent: 25 June 2008 05:30
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: Need to output an opening or closing tag by itself
>
> I have a simple XSLT problem for the gurus.
>
>
> This is my input document:
> <root>
> <e t="a"/>
> <f/>
> <f/>
> <e t="b"/>
> </root>
>
>
> This is the output document I want to produce:
> <root>
> <e>
> <f/>
> <f/>
> </e>
> </root>
>
>
> This is the stylesheet I wrote to do the transformation:
> <?xml version="1.0" encoding="UTF-8"?>
> <xsl:stylesheet
> version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
>
> <xsl:template match="/root">
> <root>
> <xsl:apply-templates/>
> </root>
> </xsl:template>
>
> <xsl:template match="e">
> <xsl:choose>
> <xsl:when test="@t ='a'">
> <e>
> </xsl:when>
> <xsl:when test="@t ='b'">
> </e>
> </xsl:when>
> <xsl:otherwise>
> <xsl:message terminate="yes">
> Unexpected data in attribute t.
> </xsl:message>
> </xsl:otherwise>
> </xsl:choose>
> </xsl:template>
>
> <xsl:template match="f">
> <xsl:copy/>
> </xsl:template>
> </xsl:stylesheet>
>
>
> Here is the Saxon output:
> $ java -jar "c:\Program Files\Saxon\saxon9.jar" -o out.xml
> in.xml test.xslt Error on line 16 column 9 of
> file:/C:/Documents%20and%20Settings/DFREY/Desktop/test/test.xslt:
> SXXP0003: Error reported by XML parser: The element type
> "e" must be terminated by the
> matching end-tag "</e>".
> Failed to compile stylesheet. 1 error detected.
>
>
> I understand that the source of the error is that the XSLT
> file is not valid XML because the <e> tag doesn't have a
> matching </e> tag in the right place.
>
> How can I work around this issue to solve my problem?
>
> Thanks,
> David
|