如何使用xslt-xquery-serialization命名空间导出到JSON

时间:2018-02-20 00:40:39

标签: xquery saxon xquery-3.0

我正在尝试使用WikiBooks中的“转换XML到JSON”示例https://en.wikibooks.org/wiki/XQuery/Convert_XML_to_JSON

xquery version "3.0";

declare namespace output="http://www.w3.org/2010/xslt-xquery-serialization";

declare option output:method "json";
declare option output:media-type "application/json";

let $test := <root>
  <!-- simple elements -->
  <aaa>AAA</aaa>
  <bbb>BBB</bbb>
  <ccc>CCC</ccc>
  <!-- complex (nested) element -->
  <ddd>
     <eee>
        <fff>
           <ggg>GGG</ggg>
        </fff>
     </eee>
  </ddd>
  <!-- duplicate elements -->
  <hhh>HHH1</hhh>
  <hhh>HHH2</hhh>
  <hhh>HHH3</hhh>
  <hhh>HHH4</hhh>
  <!-- attributes -->
  <iii a1="123" a2="456" a3="789"/>
  <!-- attributes with text content-->
  <jjj a1="123" a2="456" a3="789">JJJ</jjj>
</root>

return $test

我正在使用Saxon解析器,使用此命令行

java -cp Saxon-HE-9.8.0-8.jar net.sf.saxon.Query xml2json.xqy

但它仍然将$ test变量作为xml返回,我缺少什么?

1 个答案:

答案 0 :(得分:1)

您引用的wikibook文章不正确。根据相关规范,XSLT和XQuery Serialization 3.1,JSON序列化方法处理XML节点as follows

  

通过使用json-node-output-method参数指定的方法输出序列化节点的结果,将数据模型实例中的节点序列化为JSON字符串。该节点序列化,序列化参数omit-xml-declaration设置为yes,并且没有设置其他序列化参数。

换句话说,像Saxon这样的XQuery处理器应该将XML节点序列化为JSON字符串。

为了实现wikibook文章所承诺的目标,您需要将文档转换为地图和数组,或转换为可以提供给xml-to-json()`函数的中间格式。