[Bug 27455] New: [xp31[ Unary lookup: specification gaps

https://www.w3.org/Bugs/Public/show_bug.cgi?id=27455

            Bug ID: 27455
           Summary: [xp31[ Unary lookup: specification gaps
           Product: XPath / XQuery / XSLT
           Version: Last Call drafts
          Hardware: PC
                OS: All
            Status: NEW
          Severity: normal
          Priority: P2
         Component: XPath 3.1
          Assignee: jonathan.robie@gmail.com
          Reporter: mike@saxonica.com
        QA Contact: public-qt-comments@w3.org

@@ comments on the text flagged with "@@"

[76]       UnaryLookup       ::=       "?" KeySpecifier
[53]       KeySpecifier       ::=       NCName | IntegerLiteral |
ParenthesizedExpr | "*"
UnaryLookup returns a sequence of values selected from the context item, which
must be a map or array. If the context item is not a map or an array, an error
is raised [err:XPTY0tbd].

@@ already raised: tbd needs to be defined.

If the KeySpecifier is not a wildcard

@@ nowhere is it said that "wildcard" means "*"

, the semantics of the UnaryLookup operator are as follows: Let KS denote the
items in the sequence to which the KeySpecifier evaluates. The UnaryLookup
operator is equivalent to the following expression:

for $k in KS
return .($k)

@@ This equivalence does not hold in the error case where teh context item is a
function other than a map or array.

Unary lookup is used primarily in predicates (e.g. $map[?name='Mike'] or with
the simple mapping operator (e.g. $maps ! ?name='Mike'). 

@@ In XSLT, which makes much more use of the context item, it is likely to be
used much more widely, e.g <xsl:sort select="?id"/>.

See 3.11.3.2 Postfix Lookup for the postfix lookup operator.

Examples:

?name is equivalent to .("name"), an appropriate lookup for a map.
?2 is equivalent to .(2), an appropriate lookup for an array or an
integer-valued map.
?($a) is equivalent to for $k in $a return .($k), allowing keys for an array or
map to be passed using a variable.
?(2 to 4) is equivalent to for $k in (2,3,4) return .($k), a convenient way to
return a range of values from an array.

@@ It might be worth pointing out that the function signature for array
functions expects xs:integer, the supplied value is atomized, and converted to
integer if it is untyped atomic. But supplying a double will give a type error.
So if @id is untypedAtomic "3", then ?(@id) works, but ?(@id+1) does not.

@@ It might also be worth a reminder that you get a dynamic error if the
subscript is out of bounds. For example

([1,2,3], [1,2,5], [1,2])[?3 = 5] gives an error because ?3 on one of the items
in the sequence fails. However, exists(([1,2,3], [1,2,5], [1,2])[?3 = 5]) might
succeed because of early exit.

If the KeySpecifier is "*" and the context item is a map, unary lookup is
equivalent to the following expression:

for $k in map:keys(.)
return .($k)

@@ We don't provide an equivalence for the case where the KeySpecifier is "*"
and the context item is an array. I think the equivalence is

for $k in 1 to array:size(.)
return .($k)

-- 
You are receiving this mail because:
You are the QA Contact for the bug.

Received on Thursday, 27 November 2014 11:16:47 UTC