function - 使用 XQuery 展平 XML
问题描述
我正在尝试将 XML 层次结构展平到文本节点,其中输出标记名称是每个文本节点路径上的连字符连接标记。我将http://www.chilkatsoft.com/xml-samples/bookstore.xml提供的示例 XML用作输入。
到目前为止,我已经创建了这个 XQuery:
declare function local:flatten($prefix as xs:string*, $nodes as node()*) as node()*
{
for $node in $nodes
return
typeswitch($node)
case element() return
local:flatten(insert-before($prefix, 1, $node/name()), $node/node())
case text() return
element {string-join(fn:reverse($prefix), '-')} {string($node)}
default return
'oops'
};
for $b in //bookstore/book return
local:flatten((), $b)
这主要是有效的,但输出看起来像:
<?xml version="1.0" encoding="UTF-8"?>
<book>
</book>
<book-title>The Iliad and The Odyssey</book-title>
<book>
</book>
<book-price>12.95</book-price>
<book>
</book>
<book-comments>
</book-comments>
<book-comments-userComment> Best translation I've read. </book-comments-userComment>
<book-comments>
</book-comments>
<book-comments-userComment> I like other versions better. </book-comments-userComment>
<book-comments>
</book-comments>
<book>
</book>
...
我不关心此时缺少根元素(一次一步),但我不希望正确呈现的文本节点之间存在虚假的空父标签。我究竟做错了什么?我对 XQuery 很陌生,可能犯了一个愚蠢的错误。
解决方案
<book>
您的 XQuery 处理器将元素之间的边界空白<title>
视为文本节点。要在查询中丢弃这些,您需要修改 typeswitch 中的元素大小写,如下所示:
case text() return
if (normalize-space($node) eq "") then
()
else
element {string-join(fn:reverse($prefix), '-')} {string($node)}
推荐阅读
- javascript - 在 Cloud Function Firebase 中创建 GeoHash(用于 GeoFire)
- python - 如何在运动物体的轨迹中找到冗余路径(子路径)?
- android - 应用程序模块在 Android Studio 中消失
- swift - 快速控制流计数与倍数
- python - 如何在pygame中检测鼠标悬停在图像(圆形)上
- machine-learning - 如何将此模型输出从浮点数更改为字符串?
- react-native - 如何创建反应原生编辑器和输出
- c# - Azure Web App 抛出“请求被中止:无法创建 SSL/TLS 安全通道。”
- r - r 中具有 iid 随机效应的泊松 GLM 的奇怪输出
- postgresql - (psycopg2.ProgrammingError) 缺少表“t”的 FROM 子句条目