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 |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Need to output an opening, David Frey | Thread | RE: [xsl] Need to output an opening, Pankaj Chaturvedi |
Re: [xsl] Need to output an opening, David Carlisle | Date | RE: [xsl] Need to output an opening, Pankaj Chaturvedi |
Month |