跳转至内容

XQuery/Simile Exhibit

来自维基教科书,开放世界中的开放书籍

您想要创建一个 Simile Exhibit 的 XML 文件输出。为此,我们需要将 XML 转换为 JSON 文件格式。

您有一个书籍贡献者文件,您想要创建其位置的地图。

<contributors>
    <contributor>
        <author-name>John Doe</author-name>
        <bio>John is a software developer interested in the semantic web.</bio>
        <location>New York, NY</location>
        <image-url>http://www.example.com/images/john-doe.jpg</image-url>
    </contributor>
    <contributor>
        <author-name>Sue Anderson</author-name>
        <bio>Sue is an XML consultant and is interested in XQuery.</bio>
        <location>San Francisco, CA</location>
        <image-url>http://www.example.com/images/sue-anderson.jpg</image-url>
    </contributor>
</contributors>

XQuery 输出 JSON 文件

[编辑 | 编辑源代码]

首先,我们必须将我们的 XML 文件转换为 JSON 格式。这有点棘手,因为 JSON 要求将大括号字符添加到输出中。这可以通过创建包含字符串的特殊变量来完成。

在 XQuery 标头中,我们还必须将序列化方法从传统的 XML 更改为 text/plain。

我们还必须将项目输出包装在 string-join() 函数中,以防止最后一个逗号被序列化。

JSON 文件只是另一种用于存储层次数据的文件格式。就像 XML 一样。JSON 主要用于不熟悉 XML 或没有 XML 编辑工具来验证文件格式的 JavaScript 开发人员。JSON 允许嵌套复杂数据,但不支持 XML 的许多功能,例如命名空间。

与 XQuery 不同,JSON 文件格式不允许在标签中使用“破折号”字符,除非您在标签周围加上引号。因此请注意,image-url 属性标签周围有引号。

xquery version "1.0";
declare option exist:serialize "method=text media-type=text/plain";

let $document := '/db/apps/exhibit/data/contributors.xml'
(: special characters such as left and right curly brace and newline  :)
let $lcb := '{', $rcb := '}', $nl := '
'
(: json file header and footer as well as item header and footers :)
let $json-header := concat($lcb, $nl, ' "items" : [ ')
let $json-footer := concat($nl, '  ]', $nl,$rcb)
let $item-header := concat($nl, '    ', $lcb, '  ')
let $item-footer := concat('    ', $rcb)
return
<results>{$json-header}
{
   string-join(
      for $contributor in doc($document)/contributors/contributor
      return
<item>{$item-header}label:       "{$contributor/author-name/text()}",
       location:     "{$contributor/location/text()}",
       "image-url":    "{$contributor/image-url/text()}"
{$item-footer}</item>
   , ', ')
}{$json-footer}</results>

JSON 输出示例

[编辑 | 编辑源代码]
{
 "items" : [ 
    {  label:        "John Doe",
       location:     "New York, NY",
       "image-url":  "http://www.example.com/images/john-doe.jpg"
    }, 
    {  label:        "Sue Anderson",
       location:     "San Francisco, CA",
       "image-url":  "http://www.example.com/images/sue-anderson.jpg"
    }
  ]
}

替代方法

[编辑 | 编辑源代码]

另一种方法是使用 XQuery 中可以转义大括号的事实,方法是将其加倍。由于输出被序列化为文本,因此所有元素都将被序列化,因此无需单独序列化项目。

xquery version "1.0";
declare option exist:serialize "method=text media-type=text/plain";
let $document := '/db/Wiki/JSON/contributors.xml'
return

<result>
{{
  "items" : [
{
   string-join(
      for $contributor in doc($document)/contributors/contributor
      return
<item>
       {{
label: "{$contributor/author-name}",
location: "{$contributor/location}",
"image-url":  "{$contributor/image-url}"
       }}
</item>
       , ', '
     )
}
     ]
}}
</result>

执行

华夏公益教科书