Xpath baseX中的XQuery返回错误

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> ......

下面是XML文件-

<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")]