xsl-list
[Top] [All Lists]

Re: [xsl] xsl:if test = empty string, returns true

2012-05-15 09:03:23
Thank you all so much for all the rather granular explanations.

One thing I tried unsuccessfully is finding a way to unequivocally see what was 
coming out of the function, and what xsl:if was testing. Up until know I have 
only played with XSLT using a general-purpose text editor and running Saxon a 
zillion times.

When I started guessing that I was not quite understanding what exactly the 
function was returning, I tried to find a visual debugger that could describe 
it to me. I tried Oxygen Developer's demo, but could not find a way to do that 
(i.e. showing me what exactly xsl:if was testing).

Any heads up on how or with what tool I could have noticed I was getting a node 
and not a string (besides learning XSLT properly)? I use Mac OS X 10.7 so I am 
limited by what works on this platform.

--
Jorge


El 14/05/2012, a las 16:52, Michael Kay <mike(_at_)saxonica(_dot_)com> escribió:

You're not alone in finding this confusing. Some highly experienced people 
have given you incorrect information on this thread.

  <!-- Function to fetch value of a key-string pair in plist -->
  <xsl:function name="me:metadata">
      <xsl:param name="label"/>
      <xsl:value-of 
select="normalize-space($metadata/plist/dict/key[text()=$label]/following::node()[1]/text())"/>
  </xsl:function>

This function is NOT returning a string, and it is NOT returning a document 
node as some have suggested. It is returning a text node, because that is 
what<xsl:value-of>  creates. Unlike xsl:variable, xsl:function does not wrap 
the text node in a document node; in the absence of an "as" attribute on 
xsl:function, it returns the text node unchanged.

Although I always recommend using an "as" attribute on xsl:function and 
xsl:param to make it clear what the inputs and output to the function are 
expected to be, the simplest fix to this function is to change<xsl:value-of>  
to<xsl:sequence>. It's a common mistake to use xsl:value-of when there is no 
intention or need to create a text node. The normal default way of returning 
a result from a function should be to use xsl:sequence.

Any idea why the test evaluates to true?

The effective boolean value of a node is always true. In fact, Saxon can work 
out that this function will always return a text node, and it will probably 
therefore decide that the EBV of the function call is true without even 
calling the function.

Michael Kay
Saxonica


--~------------------------------------------------------------------
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>
--~--