XQuery/Simile Exhibit
外观
< XQuery
您想要创建一个 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>
首先,我们必须将我们的 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>
{ "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>