Subject: Re: Applying text nodes: 2 processors, 2 behaviours
From: David N Bertoni/Cambridge/IBM <david_n_bertoni@xxxxxxxxxx>
Date: Mon, 18 Nov 2002 09:01:58 -0800
|
sguazt@xxxxxxxxxxx wrote:
> Hi,
> I have a named template that calls the <xsl:apply-templates>
> instruction on its argument; however I have problem when I
> pass a text as argument. More precisely with Sablot XSLT processor
> I obtain the result I expect (and that I would it be!!) whereas
> with LibXSLT processor I do not get what I want.
OK, but what are the results of the two processors? You didn't tell us
either what they were, or what you want.
> In the absence of a select attribute, the xsl:apply-templates
> instruction processes all of the children of the current node,
> including text nodes. However, text nodes that have been stripped
> as specified in [3.4 Whitespace Stripping] will not be processed.
> If stripping of whitespace nodes has not been enabled for an element,
> then all whitespace in the content of the element will be processed
> as text, and thus whitespace between child elements will count in
> determining the position of a child element as returned by the
> position function.
I'm not sure how this quote is relevant. All of the xsl:apply-template
instructions in your sample have select attributes, and there are no
xsl:strip-space or xsl:preserve-space instructions.
In this template, the with-param instructions "title" and "body" create
result tree fragments:
> <xsl:template match="root">
> <html>
> <body>
> <xsl:call-template name="msg">
> <xsl:with-param name="title">A
Title</xsl:with-param>
> <xsl:with-param name="body">Body: <xsl:value-of
> select="node" /></xsl:with-param>
> </xsl:call-template>
> </body>
> </html>
> </xsl:template>
In this template, you attempt to use each these params as a node-set, which
is illegal:
> <xsl:template name="msg">
> <xsl:param name="title" />
> <xsl:param name="body" />
>
> <p><strong><xsl:apply-templates select="$title" /></strong></p>
> <p><em><xsl:apply-templates select="$body" /></em></p>
> </xsl:template>
Running on Xalan-C++ 1.4, I get:
C:\test\Guazzone>Xalan test1.xml test1.xsl
XSLT error: xsl:for-each 'select' must evaluate to a node-set, source tree
node:
root (file:///V:/test/Guazzone/test1.xsl, line 26, column 59)
So, if LibXSLT is reporting a similar error, then its behavior is correct.
If Sablotron allows this stylesheet, then it is either in error, or is
implementing the old XSLT 1.1 draft recommendation. I suspect it's just a
bug.
If you really need to turn a result tree fragment into a node-set, you
should either use the EXSLT node-set function, or your processor's
proprietary one.
Dave
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
|