Forums » Saxon/C Help and Discussions »
Returning maps from XQuery
Added by Martin Honnen about 5 years ago
So far I understand that XQuery/XSLT/XPath 3 maps and arrays as functions have no representation in the Python API. Nevertheless I wonder whether a query creating a map and serializing as JSON and using run_query_to_string
should not return the JSON serialization of the map. I seem to get None
. Is that intended?
One file I have tries
import saxonc
with saxonc.PySaxonProcessor(license=False) as proc:
print(proc.version)
xquery_processor = proc.new_xquery_processor()
query = """declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";
declare option output:method 'json';
map { 'prop1' : 'value 1', 'prop2' : 'value 2' }"""
xquery_processor.set_property("!method", "json")
result = xquery_processor.run_query_to_string(query_text = query)
print("string result: ", result)
result = xquery_processor.run_query_to_value(query_text = query)
print("value result: ", result)
but outputs
Saxon/C 1.2.1 running with Saxon-HE 9.9.1.5J from Saxonica
string result: None
value result: None
, that is, None
even for the run_query_to_string
result.
The other tries to solely rely on XQuery's declare option
for the serialization method
import saxonc
with saxonc.PySaxonProcessor(license=False) as proc:
print(proc.version)
xquery_processor = proc.new_xquery_processor()
query = """declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";
declare option output:method 'json';
map { 'prop1' : 'value 1', 'prop2' : 'value 2' }"""
result = xquery_processor.run_query_to_string(query_text = query)
print("string result: ", result)
result = xquery_processor.run_query_to_value(query_text = query)
print("value result: ", result)
and also outputs
Saxon/C 1.2.1 running with Saxon-HE 9.9.1.5J from Saxonica
string result: None
value result: None
Replies (3)
Please register to reply
RE: Returning maps from XQuery - Added by Martin Honnen about 5 years ago
I have run some similar tests now using XSLT 3 and there the JSON serialization of maps with the call/apply-templates_returning_string gives me a proper string output and not None. And to_value nicely emits a warning/error "Error: applyTemplateToValue: FunctionItem found. Currently not be handled".
So somehow the XSLT 3 part of the API is more advanced than the XQuery 3 part to serialize maps correctly when strings are requested or to emit a warning of lack of function handling when values are requested.
RE: Returning maps from XQuery - Added by O'Neil Delpratt about 5 years ago
Hi,
Thanks for reporting the issues you have found.
Saxon/C has reached a mature status now we really should be supporting the XdmFunctionItem
class like as in Java. We have all the capabilities given that the XdmFunctionItem object is being correctly passed to the C++ code, which it recognises but not doing anything with it.
I have created a bug issue for this feature request: 4365
Also the run_query_to_string
should properly return a string of the map. I have raised a related bug issue for this:
RE: Returning maps from XQuery - Added by O'Neil Delpratt about 5 years ago
Bug issue #4366 has been fixed. Patch available in the next maintenance release. Serialization properties defined using declare option output:x = 'value'
will now be picked up. Also properties defined using the setProperty function, e.g setProperty("!method", "json")
will also be picked up.
Please register to reply