Hi Tim, hi Joe,
The query works if you use parentheses around the arrow operands:
(json-doc("http://lae.princeton.edu/catalog/0bp35.jsonld%22)(%22@context") => json-doc())("@context")
This is in compliance with the XQuery 3.1 spec [1].
Out of interest, I spent some time and looked up the W3 bug tracker history, and I spotted a change in the precedence of the arrow operator [2]. Maybe this change is not reflected in eXist?
Hope this helps, Christian
[1] http://www.w3.org/TR/xquery-31/#doc-xquery31-ArrowExpr [2] https://www.w3.org/Bugs/Public/show_bug.cgi?id=27537
I tested your code with the closest thing at hand - a local build of branch of Wolfgang Meier's eXist repo with support for the arrow operator (https://github.com/wolfgangmm/exist/tree/feature/arrowop) - and your code worked fine there. So my hunch is that there's a bug in BaseX or some syntax error I'm not seeing in your code. For the record, here's the code I'm running:
-- xquery version "3.1";
json-doc("http://lae.princeton.edu/catalog/0bp35.jsonld%22)(%22@context") => json-doc()("@context") --
To check the results I actually use `=> serialize(<serialization-parameters xmlns="http://www.w3.org/2010/xslt-xquery-serialization"><method>json</method><indent>yes</indent></serialization-parameters>)` on the results since eXist doesn't support adaptive serialization.
I hope this is helpful.
Joe
On Sat, Jan 9, 2016 at 6:20 PM, Tim Thompson timathom@gmail.com wrote:
Thanks, Joe! I guess I'd glossed over the "funky" example ;-) Regarding the arrow operator, I was wondering whether something like this was possible:
json-doc(" http://lae.princeton.edu/catalog/0bp35.jsonld%22)(%22@context") => json-doc()("@context")
which throws an error: [XPST0003] Unexpected end of query: '("@context")'.
Tim
On Sat, Jan 9, 2016 at 3:53 PM, Joe Wicentowski joewiz@gmail.com wrote:
Hi Tim,
For your first question, I think your example falls into what the spec calls "funky looking" keys. See the 3rd bullet point example under http://www.w3.org/TR/xquery-31/#id-lookup:
funky / <looking @string") is equivalent to .("$funky / <looking @string"), an appropriate lookup for a map with rather odd conventions for keys.
In other words, I think you're stuck with the ("@context") approach.
As to your second question, it looks like what you're proposing should work - but am I reading you as saying you get an error with your proposed approach? If so, what's the error?
Joe
Sent from my iPad
From: Tim Thompson timathom@gmail.com Sent: Saturday, January 9, 2016 3:11 PM Subject: [basex-talk] Lookups and arrows To: BaseX basex-talk@mailman.uni-konstanz.de
Hello,
I'm testing some XQuery 3.1 features against a JSON-LD[1] document and had a few questions. In the JSON-LD format, the "@" symbol has special semantics in key names, but seems to cause problems with the 3.1 lookup operator.
For example:
json-doc(" http://lae.princeton.edu/catalog/0bp35.jsonld%22)(%22@context")
works as expected, but
json-doc(" http://lae.princeton.edu/catalog/0bp35.jsonld%22)?@context
throws an error: [XPST0003] No specifier after lookup operator: '@'.
Also, when using the "=>" operator, should it be possible to perform a lookup on the last expression in a chain, if that expression returns a map?
For example:
json-doc(" http://lae.princeton.edu/catalog/0bp35.jsonld%22)(%22@context") evaluates to " http://iiif.io/api/presentation/2/context.json"
and
json-doc(" http://lae.princeton.edu/catalog/0bp35.jsonld%22)(%22@context") => json-doc()
returns another map object. So, how would one achieve this:
json-doc(json-doc(" http://lae.princeton.edu/catalog/0bp35.jsonld%22)(%22@context%22))(%22@conte...")
using the arrow operator?
Thanks, Tim
[1] http://www.w3.org/TR/json-ld/
-- Tim A. Thompson Metadata Librarian (Spanish/Portuguese Specialty) Princeton University Library