gpt4 book ai didi

使用 idref 的 XPath 表达式

转载 作者:行者123 更新时间:2023-12-04 05:20:50 26 4
gpt4 key购买 nike

我正在阅读和测试 XQuery 以及我使用 BaseX(www.basex.org) 和 saxon-HE 9.4.0.6N 的类似测试工具。
对于以下简单的 XML 文件 - 没有附加到 sample.xml 的架构:

    <rootab>
<l1>
<items p="a">
<itema x1="10" id="abc">testa</itema>
<itemb x1="10" id="dfe">testb</itemb>
<itemc x1="10" id="jgh">testc</itemc>
</items>
</l1>
<l2>
<items p="b">
<itema x1="10" xidref="abc">testa</itema>
<itemc x1="10" xidref="jgh">testc</itemc>
<itemd x1="10" xidref="abc">testA101</itemd>
<iteme x1="10" xidref="jgh">testB202</iteme>
</items>
</l2>
</rootab>

在 Basex_GUI 中,如果我输入以下 XPath 表达式: //idref("abc")/..结果是: <itema x1="10" xidref="abc">testa</itema>
在 BaseX_GUI 中,如果我添加简单的 XQuery 表达式:
for $x in doc('sample.xml')//idref("abc")/.. 
return <aaa>{$x}</aaa>

结果是:
<aaa>
<itema x1="10" xidref="abc">testa</itema>
</aaa>
<aaa>
<itemd x1="10" xidref="abc">testA101</itemd>
</aaa>

q1) 为什么 XPath 表达式只返回一个节点?我期待两...

在 Saxon 中,通过使用以下 xql 文件:
    <test>
{
doc('sample.xml')//idref("abc")/..
}
</test>

或 XQuery 表达式,我通过运行命令 query sample.xql 收到相同的结果:
<?xml version="1.0" encoding="UTF-8"?><test/>

q2)我的撒克逊测试有什么问题?

预先感谢您的帮助!

最佳答案

基本上,idref()对 DTD 验证敏感 - 它识别声明为类型 的属性IDREF 在您的 DTD 中。

您没有向我们展示您的 DTD,更重要的是,您还没有展示如何提供查询的输入。有多种构造输入的方法,其中属性的“IDREF-ness”丢失 - 例如,通过 DOM。即使您使用 doc()在 Saxon 中,输入树的构建方式取决于许多因素,包括配置选项和您的 URIResolver。

我看到您正在使用 .NET。当 Saxon 在 .NET 上使用 Microsoft XML 解析器时,它不知道哪些属性是 ID 和 IDREF,因此 id()idref()函数不起作用(MS 解析器根本不提供此信息)。因此,您需要使用 Saxon 产品附带的 JAXP 解析器 (Xerces)。我认为这是这些天的默认设置。

所以不是真正的答案,但希望有一些背景可以解释一些可能出错的事情。

关于使用 idref 的 XPath 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13715784/

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