xsl-list
[Top] [All Lists]

Re: xsl:sequence produces error I cant understand

2004-10-10 13:36:38
Hi Kenneth,

bash-2.05b$ java net.sf.saxon.Transform seq.xsl seq.xsl
Error at if on line 15 of file:/C:/cygwin/home/zaphod/code/seq.xsl:
  Cannot write an attribute when there is no open start tag
Transformation failed: Run-time errors were reported

The result of an XSLT transformation (if there is a result) needs to
be the document node of a legal XML document (well, technically, a
legal data model instance). The XSLT processor automatically generates
the document node for you, if you don't tell it to make one
explicitly, and anything that you create in the transformation gets
added to that document node.

Now, document nodes can't have attributes: the only things you can add
to them are (as content) elements, text, comments, and PIs. It's an
error to try to add attributes to a document node; in fact, the only
kind of nodes you can add attributes to are element nodes.

The result of your template:

<xsl:template match="/">
  <xsl:for-each select="document('')/xsl:stylesheet/ns:root/ns:child">
    <xsl:if test="@attr = 'y'">
       <xsl:sequence select="@attr" />
    </xsl:if>
  </xsl:for-each>
</xsl:template>

is a sequence of attributes. The error is telling you that these
attributes can't be added to the document node that the XSLT processor
is creating automatically; to output them, you have to add them to an
element. If you do:

<xsl:template match="/">
  <result>
    <xsl:for-each select="document('')/xsl:stylesheet/ns:root/ns:child">
      <xsl:if test="@attr = 'y'">
         <xsl:sequence select="@attr" />
      </xsl:if>
    </xsl:for-each>
  </result>
</xsl:template>

then you won't get the error, but will get the result:

  <result attr="y" />

Cheers,

Jeni

---
Jeni Tennison
http://www.jenitennison.com/



<Prev in Thread] Current Thread [Next in Thread>