This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
SV: Strange Parameter Behavior
- From: "bryan" <bry at itnisk dot com>
- To: <xsl-list at lists dot mulberrytech dot com>
- Date: Fri, 10 May 2002 09:22:14 +0200
- Subject: SV: [xsl] Strange Parameter Behavior
- Reply-to: xsl-list at lists dot mulberrytech dot com
-----Oprindelig meddelelse-----
Fra: owner-xsl-list@lists.mulberrytech.com
[mailto:owner-xsl-list@lists.mulberrytech.com] På vegne af David N
Bertoni/Cambridge/IBM
Sendt: 10. maj 2002 00:03
Til: xsl-list@lists.mulberrytech.com
Emne: Re: [xsl] Strange Parameter Behavior
Michael Peet wrote:
> Given the XML:
>
> <a id="1">
> <b id="2">
> <c id="3"/>
> <c id="4"/>
> <c id="5"/>
> <c id="6"/>
> </b>
> <b id="7">
> <c id="8"/>
> <c id="9"/>
> <c id="10"/>
> </b>
> <b id="11">
> <c id="12"/>
> <c id="13"/>
> <c id="14"/>
> </b>
> </a>
>
>
> And XSLT of:
>
> <xsl:stylesheet version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
>
> <xsl:output encoding="ascii" omit-xml-declaration="yes"
indent="yes"/>
> <xsl:strip-space elements="*"/>
>
> <xsl:param name="param-id" select="/a/b/c[1]/@id"/>
>
> <xsl:template match="/">
> param-id: <xsl:value-of select="$param-id"/><br/>
> prev: <xsl:value-of select="//c[@id
= $param-id]/preceding::c[1]/@id"/><br/>
> next: <xsl:value-of select="//c[@id
= $param-id]/following::c[1]/@id"/><br/>
> </xsl:template>
>
> </xsl:stylesheet>
>
>
> I get the following expected results when passing in a parameter:
>
> param-id: 12
> prev: 10
> next: 13
Well, since you didn't provide the value the parameter, we'll have to
take your word that the result is expected.
> However, when I don't pass anything in and let the default parameter
> take
> over, I get this output:
>
> param-id: 3
> prev: 6
> next: 4
>
> Could anyone explain this? Is there a RTF at work here? When I wrap
> the
> default parameter value with a string() function, the stylesheet
> returns
the
> expected results:
>
> param-id: 3
> prev:
> next: 4
The results you got are correct, and there is no RTF involved. I can
think of several things that might be confusing you. One is the
existential quantification of the = operator when a node-set is one of
the operands. The other is that the preceeding axis is a
reverse-document-order axis, so the predicate [1] may not give you what
you expect. Since wrapping the default parameter value in a call to the
string() function gives you what you expect, you're probably getting
tripped up by the behavior of the = operator. (The string() function
will return the string value of the first node in the node-set.)
Try this variation on your template:
<xsl:template match="/">
param-id: <xsl:value-of select="$param-id"/><br/>
count: <xsl:value-of select="count($param-id)"/><br/>
prev: <xsl:value-of select="//c[@id
= $param-id]/preceding::c[1]/@id"/><br/>
prev with $param-id predicate: <xsl:value-of select="//c[@id =
$param-id[1]]/preceding::c[1]/@id"/><br/>
next: <xsl:value-of select="//c[@id
= $param-id]/following::c[1]/@id"/><br/>
</xsl:template>
Hope that helps...
Dave
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list