xsl-list
[Top] [All Lists]

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

2008-06-25 02:34:57
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(_at_)shaw(_dot_)ca] 
Sent: 25 June 2008 05:30
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
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

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--