gpt4 book ai didi

xml - XQuery 中不一致的空白处理?

转载 作者:数据小太阳 更新时间:2023-10-29 02:29:46 26 4
gpt4 key购买 nike

我对如何让 XQuery 像我希望的那样处理空格感到困惑。假设我必须遵循 XML:

<body>
to<lb/>
<choice norm="Miss">Mi<glyph ref="#sm-long-s>s</glyph>s</choice>
<name type="person"><forename>Margaret</forename> <surname>Hamilton</surname></name><lb />
<name type="place">S<hi rend="superscript">t</hi> James's</name>
</body>

如果我使用这段代码

for $body in /body
return replace(string-join(
for $t in $body//node()
return
typeswitch($t)
case text() return
if (
sum(
for $a in $t/ancestor::*
return
typeswitch($a)
case element(choice) return 1
default return 0
)=0
) then $t
else null
case element(lb) return ' '
case element(choice) return $t/@norm
default return null
),"\s+"," ")

我得到以下输出:

to MissMargaretHamilton St James's

而不是预期的

to Miss Margaret Hamilton St James's

有办法解决吗?

PS:没有<forename>这样的东西在实际代码中,但我在这个示例中引入它是为了展示换行符和 > 和 < 之间的空格被忽略。

最佳答案

这个查询有一些非常奇怪的地方。例如,在我看来,这个子表达式:

            sum(
for $a in $t/ancestor::*
return
typeswitch($a)
case element(choice) return 1
default return 0
)=0

只是一种复杂的写法empty($t/ancestor::choice)

什么是“空”?在我看来,它就像一个元素名称,与您输入的任何内容都不匹配,因此是一种复杂的 () 编写方式。

此外,您的 XML 格式不正确:ref 属性上缺少引号。这让我怀疑提交的问题不是最初执行的问题,因此您可能无意中删除了解决方案的线索。

但是,如果我修复缺失的引号并在 Saxon 中运行查询,它会产生预期的输出。所以我认为问题在于您的 XQuery 处理器中存在错误(或者更礼貌地说,不符合规范)。

稍后:经过反射(reflection),我怀疑您正在使用去除空白文本节点的 XML 解析器。这是 Microsoft MSXML 解析器的一个臭名昭著的怪癖,并且使得它在处理此类空白很重要的混合内容时非常无用。我相信它可以配置为“正常”运行,但我完全忘记了如何配置。

XQuery 规范确实在这方面给处理器留下了一定的自由度:它们允许以处理器喜欢的任何方式构造 XDM 输入树,这可能包括去除所有空白,或去除字母“x”的每个出现。在这一点上,问题是您是否发现您的特定 XQuery 处理器做出的设计选择可以接受。

关于xml - XQuery 中不一致的空白处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28768156/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com