Subject: Re: [xsl] Is a variable referencing a node From: "David Frey" <dpfrey@xxxxxxx> Date: Mon, 29 Sep 2008 07:29:31 -0800 |
On 9/27/2008, "Dimitre Novatchev" <dnovatchev@xxxxxxxxx> wrote: >On Fri, Sep 26, 2008 at 6:30 PM, David Frey <dpfrey@xxxxxxx> wrote: >> I have an XSLT 1 question. >> >> Say I have: >> >> <xsl:variable name="foo"> >> <xsl:choose> >> <xsl:when test="$aVar='someFlag'"> >> <xsl:value-of select="/path/to/some/element"/> >> </xsl:when> >> <xsl:otherwise> >> <xsl:value-of select="/path/to/another/element"/> >> </xsl:otherwise> >> </xsl:variable> >> <xsl:choose> >> <xsl:when test="$foo"> >> <xsl:value-of select="$foo"/> >> </xsl:when> >> <xsl:otherwise>--</xsl:otherwise> >> </xsl:choose> >> >> >> >> Currently, I never get "--" as my output even if $aVar is set to >> 'someFlag' and the element at "/path/to/some/element" does not exist. >> >> Can someone explain where I went wrong? > >The variable $foo is of type RTF (Result Tree Fragment). > >The XSLT 1.0 spec says: > >"A result tree fragment represents a fragment of the result tree. A >result tree fragment is treated equivalently to a node-set that >contains just a single root node" ... > >and a few lines later: > >"When a permitted operation is performed on a result tree fragment, it >is performed exactly as it would be on the equivalent node-set." > >http://www.w3.org/TR/xslt#section-Result-Tree-Fragments > >The <xsl:when/> is evaluated as per spec: > >"When an xsl:choose element is processed, each of the xsl:when >elements is tested in turn, by evaluating the expression and >converting the resulting object to a boolean as if by a call to the >boolean function." > >http://www.w3.org/TR/xslt#section-Conditional-Processing-with-xsl:choose > >this means that the value of > > boolean($foo) > >is determined and it is the same as when boolean() is applied on the >equivalent node-set of the RTF $foo. > >Because the equivalent node-set of an RTF always consists of just one >node (a root node), and the rules for boolean() say: > >"a node-set is true if and only if it is non-empty" > >http://www.w3.org/TR/xpath#section-Boolean-Functions > > >this means that boolean($foo) is always true(). > >This is why, the first <xsl:when> in the code in question is always chosen: > >> <xsl:choose> >> <xsl:when test="$foo"> >> <xsl:value-of select="$foo"/> >> </xsl:when> >> <xsl:otherwise>--</xsl:otherwise> >> </xsl:choose> > >and the <xsl:otherwise> above is never chosen. > Thanks for the detailed explanation. It sounds like the approach I was using will not work. Is there another way that I can write this template? Basically, I want a template that will output the text of a node for an arbitrary XPath if that node exists. If the node doesn't exist, I want it to produce "--". Thanks, David
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Is a variable referencing, Wendell Piez | Thread | Re: [xsl] Is a variable referencing, David Carlisle |
Re: [xsl] Still thinking to object , Jonas Bassl | Date | [xsl] Getting the value of an attri, Bradley, Peter |
Month |