Xpath baseX中的XQuery返回错误
下面是XML文件-Xpath baseX中的XQuery返回错误,xpath,xquery,basex,Xpath,Xquery,Basex,下面是XML文件- <Chapters> <Chapter> <Name>Introduction</Name> <Heads> <Head> <No>1</No> <Title>History of Internet</Title> <Desc> ......
<Chapters>
<Chapter>
<Name>Introduction</Name>
<Heads>
<Head>
<No>1</No>
<Title>History of Internet</Title>
<Desc>
..............
</Desc>
</Head>
<Head>
<No>2</No>
<Title>History of HTML</Title>
<Desc>
..............
</Desc>
</Head>
</Heads>
</Chapter>
<Chapter>
<Name>Learn HTML</Name>
<Heads>
<Head>
<No>1</No>
<Title>Browsers</Title>
<Desc>
..............
</Desc>
</Head>
<Head>
<No>2</No>
<Title>Browser War</Title>
<Desc>
..............
</Desc>
</Head>
<Head>
<No>3</No>
<Title>HTML, DHTML</Title>
<Desc>
..............
</Desc>
</Head>
</Heads>
</Chapter>
</Chapters>
介绍
1.
互联网史
..............
2.
HTML的历史
..............
学习HTML
1.
浏览器
..............
2.
浏览器战争
..............
3.
HTML,DHTML
..............
我想列出章节/章节/名称=引言和章节/章节/标题/标题/编号=1
以下是我在baseX中执行的查询-
/章节/章节[包含(名称,'Introduction')和包含(Heads/Head/No,'1')]/Heads/Head/Title
这就是错误-
Query:Chapters/Chapter[contains(Name,'Introduction')和contains(Heads/Head/No,'1')]/Heads/Head/Title
错误:[XPTY0004]应为单个项,(找到元素号{…},元素号{…})。
根据baseX网站,错误XPTY0004的描述如下-
如果表达式的类型错误,或者无法转换为指定的类型,则会引发此错误。它可以静态(在查询编译期间)或动态(在运行时)引发。
我做错了什么???这个可以解决问题
/Chapters/Chapter[Name='Introduction']/Heads/Head[No='1']/Title
但是我不能回答你的问题。。。我无法解释为什么你的查询会出错 fn:contains($arg1作为xs:string?,$arg2作为xs:string?)as xs:boolean
测试字符串$arg2
是否包含在$arg1
中。它要求每个参数使用单个字符串(或空值()
)
路径步骤(此处:Heads/Head/Title
)返回所有适合的元素,因此所有Heads的所有标题都是正确的。如果删除“简介”一章的第二个标题,查询将成功运行
包含
是错误的方法<代码>=在一组语义上进行比较。使用John的解决方案或更接近您的解决方案(但John的解决方案可能更快):
contains()的第一个参数必须是单个字符串,但是对于上面表达式中对contains()
的第二个引用,参数Heads/Head/No
的计算结果为两个元素
表达式的更正将为:
/Chapters/Chapter
[Name[contains(.,'Introduction')]
and
Heads/Head/No[contains(.,'1')]
]
/Heads/Head/Title
备注:似乎你实际上需要测试平等性,而不是遏制性。这可以用多种方式表达,其中之一是:
/Chapters/Chapter
[Name eq 'Introduction']
and
Heads/Head/No[. eq '1']
]
/Heads/Head/Title
为了完整性和其他处理同一问题的人员,只需跟进: 您的代码将无法工作,正如前面指出的那样,
contains
不接受字符串序列作为其第一个参数
(: ssce: :)
let $doc := <doc>
<a>
<b>foo</b>
<b>bar</b>
</a>
</doc>
return $doc/a[contains(b, "bar")]
(:ssce::)
让$doc:=
(expr中的一些$var
和expr中的每个$var
)是一种简洁的方式来表达您实际正在做的事情
/Chapters/Chapter
[Name eq 'Introduction']
and
Heads/Head/No[. eq '1']
]
/Heads/Head/Title
(: ssce: :)
let $doc := <doc>
<a>
<b>foo</b>
<b>bar</b>
</a>
</doc>
return $doc/a[contains(b, "bar")]
(: ssce, this time working: :)
let $doc := <doc>
<a>
<b>foo</b>
<b>bar</b>
</a>
</doc>
return $doc/a[some $b in b/text() satisfies contains($b, "bar")]