- From: <bugzilla@jessica.w3.org>
- Date: Thu, 27 Nov 2014 11:16:46 +0000
- To: public-qt-comments@w3.org
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