- 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