By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
440,322 Members | 1,904 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 440,322 IT Pros & Developers. It's quick & easy.

xsl variable $node/text() but $node can non-node-set help!

P: n/a
I have a variable $value as a parameter in the following template:

<xsl:template name="myTemplate">
<xsl:param name="value"/>
<xsl:if test="$value">
<xsl:value-of select="$value"/>
</xsl:if>
</xsl:template>

Now i call myTemplate sometimes whit the a parameter $value that
is sometimes a text node, and sometimes it is not even a node.
Example:

<inputDoc>
<a>hello</a>
<a/>
</inputDoc>

xsl:

<xsl:for-each select="/inputDoc/a">
<xsl:call-template name="myTemplate">
<xsl:with-param name="value" select="./text()"/>
</xsl:call-template>
</xsl:for-each>
So i call myTemplate with parameter $value=a/text()

But for the second <aelement in <inputDocthere
is not text() node.

This gives me the following error:

Cause: javax.xml.transform.TransformerException: The value is not a
node-set

With line number of the error pointing to the xsl:if in myTemplate.
No i tried the function nilled(), but that is XPath 2.0, i only
use XPath 1.0 and XSL 1.0

i know a possible solution is this:

<xsl:for-each select="/inputDoc/a">
<xsl:choose>
<xsl:when test=".[not(node())]">

<xsl:call-template name="myTemplate">
<xsl:with-param name="value" select="false()"/>
</xsl:call-template>

</xsl:when>
<xsl:otherwise>

<xsl:call-template name="myTemplate">
<xsl:with-param name="value" select="./text()"/>
</xsl:call-template>

</xsl:otherwise>
</xsl:for-each>
But this requires me to change every call to myTemplate,
which is alot of code. Can't i change myTemplate so
it works?

Who can help me? Please..
Aug 23 '06 #1
Share this Question
Share on Google+
2 Replies


P: n/a


Tjerk Wolterink wrote:
I have a variable $value as a parameter in the following template:

<xsl:template name="myTemplate">
<xsl:param name="value"/>
<xsl:if test="$value">
<xsl:value-of select="$value"/>
</xsl:if>
</xsl:template>

Now i call myTemplate sometimes whit the a parameter $value that
is sometimes a text node, and sometimes it is not even a node.
Example:

<inputDoc>
<a>hello</a>
<a/>
</inputDoc>

xsl:

<xsl:for-each select="/inputDoc/a">
<xsl:call-template name="myTemplate">
<xsl:with-param name="value" select="./text()"/>
That means the value you pass in _is_ a node set (of text nodes) but
that node set might be empty. I don't see why that should give you an
error for <xsl:if test="$value">, doing that test on an empty node set
should simply yield false.
This gives me the following error:

Cause: javax.xml.transform.TransformerException: The value is not a
node-set

With line number of the error pointing to the xsl:if in myTemplate.
What XSLT processor is that? Are you sure the code is as simple as you
have posted? Have you tried with different XSLT processors?
--

Martin Honnen
http://JavaScript.FAQTs.com/
Aug 23 '06 #2

P: n/a
There is nothing wrong with the posted code -- either the reason is in code
that was not shown or the XSLT processor used is non-compliant.

A typical advise/requirement is to post a complete (but the minimal
possible) example of the xslt stylesheet and the source xml document, to say
what is the expected result, what is the actual result and how the actual
result differs from what was expected.

Cheers,
Dimitre Novatchev.
"Tjerk Wolterink" <tj***@wolterinkwebdesign.comwrote in message
news:ec**********@netlx020.civ.utwente.nl...
>I have a variable $value as a parameter in the following template:

<xsl:template name="myTemplate">
<xsl:param name="value"/>
<xsl:if test="$value">
<xsl:value-of select="$value"/>
</xsl:if>
</xsl:template>

Now i call myTemplate sometimes whit the a parameter $value that
is sometimes a text node, and sometimes it is not even a node.
Example:

<inputDoc>
<a>hello</a>
<a/>
</inputDoc>

xsl:

<xsl:for-each select="/inputDoc/a">
<xsl:call-template name="myTemplate">
<xsl:with-param name="value" select="./text()"/>
</xsl:call-template>
</xsl:for-each>
So i call myTemplate with parameter $value=a/text()

But for the second <aelement in <inputDocthere
is not text() node.

This gives me the following error:

Cause: javax.xml.transform.TransformerException: The value is not a
node-set

With line number of the error pointing to the xsl:if in myTemplate.
No i tried the function nilled(), but that is XPath 2.0, i only
use XPath 1.0 and XSL 1.0

i know a possible solution is this:

<xsl:for-each select="/inputDoc/a">
<xsl:choose>
<xsl:when test=".[not(node())]">

<xsl:call-template name="myTemplate">
<xsl:with-param name="value" select="false()"/>
</xsl:call-template>

</xsl:when>
<xsl:otherwise>

<xsl:call-template name="myTemplate">
<xsl:with-param name="value" select="./text()"/>
</xsl:call-template>

</xsl:otherwise>
</xsl:for-each>
But this requires me to change every call to myTemplate,
which is alot of code. Can't i change myTemplate so
it works?

Who can help me? Please..

Aug 24 '06 #3

This discussion thread is closed

Replies have been disabled for this discussion.