W3C home > Mailing lists > Public > public-qt-comments@w3.org > August 2006

[Bug 3618] let score clause

From: <bugzilla@wiggum.w3.org>
Date: Wed, 23 Aug 2006 10:10:11 +0000
To: public-qt-comments@w3.org
Message-Id: <E1GFpgZ-0006lv-8j@wiggum.w3.org>


           Summary: let score clause
           Product: XPath / XQuery / XSLT
           Version: Working drafts
          Platform: PC
        OS/Version: Windows XP
            Status: NEW
          Severity: normal
          Priority: P2
         Component: Full Text
        AssignedTo: sihem@research.att.com
        ReportedBy: davidc@nag.co.uk
         QAContact: public-qt-comments@w3.org

section 2.3 says
The let variable may be dropped from the let clause, if the score variable is

and this is more or less the full description of the meaning of this

I assumed from this that it meant that if the "normal" let variable is not used
in the return clause, it could be dropped, and that this was just a syntactic
simplification, so that

let $x score $s := $input[title ftcontains "foo"]

could be equivalently written without the $x as

let score $s := $input[title ftcontains "foo"]

however all actual examples of let score in the document so not use a
node-valued expression but rather the full text boolean expression itself.

let score $s := title ftcontains "foo"

Could the specification clarify for the let score clause whether the ExprSingle
to the right of the := must be an ftselection and if it may either be an
ftselection or a path expression, what exactly is being scored in either case.

The semantics of the expresion are further expanded in 4.3.2 but again that is
essentially silent on whether fts:score expects a path expression or an
ftselection as its argument.

This question came about trying to use scoring in xpath, where I need to return
the score as a value. To return the score of testing the current node against
"foo" I thought from reading the text that I had to do

let score $s :=.[. ftcontains "foo"] return $s

but the examples suggest that I could do

let score $s := . ftcontains "foo" return $s

but it isn't clear if these are equivalent. Of course as currently defined
neither can be used in XPath so I have to use

for $x score $s in .[. ftcontains "foo"] return $s

which is fairly horrible, and strongly suggests that the currently proposed
syntax for scoring is unsuitable for use in XPath.

It would be much better for XPath (and XQuery) use if there was a function
syntax such as score() which returned the score of the current item (from
wherever it was selected) The spec has some arguments why this is not possible
in as the value would depend on the context but those arguments would apply
equally to position() or xslt's current(), The context would have to hold the
current nodes score as well as it's value. It doesn't mean that score() has to
be a constant as it is a 0-ary function.

That would allow

<xsl:for-each select="/a/b[c ftcontains'x']">
  <xsl:sort select="score()"/>

(I'm using xslt here but any non-xquery binding of xpath would have the same

I suspect that the WG would have some resistance to revisiting the score syntax
but if the current syntax is kept then at the very least I think that the let
clause should be added back into xpath as extended by full text. Then at least
Xpath would have

<xsl:for-each select="/a/b[c ftcontains 'x']">
  <xsl:sort select="let score $s := c ftcontains 'x' return $s"/>

which is rather verbose and repetitive but much better than the current

<xsl:for-each select="/a/b[c ftcontains 'x']">
  <xsl:sort select="for $x score $s in .[c ftcontains 'x'] return $s"/>

See also 

see also the related bug #3596 and the earlier thread on qt-comments starting
Received on Wednesday, 23 August 2006 10:10:21 UTC

This archive was generated by hypermail 2.4.0 : Friday, 17 January 2020 16:57:13 UTC