RE: [xsl] Need to output an opening or closing tag by itself

Subject: RE: [xsl] 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: [xsl] 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

Current Thread