繁体   English   中英

XQuery在baseX中返回错误

[英]XQuery returning error in baseX

以下是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以下是我在baseX中执行的查询 -

/章节/章节[包含(名称,'简介')和包含(头/头/否,'1')] /头/头/标题

而这是错误 -

Query: Chapters/Chapter[contains(Name,'Introduction') and contains(Heads/Head/No,'1')]/Heads/Head/Title

Error: [XPTY0004] Single item expected, (element No { ... }, element No { ... }) found.

根据baseX网站,错误XPTY0004的描述是 -

This error is raised if an expression has the wrong type, or cannot be cast into the specified type. It may be raised both statically (during query compilation) or dynamically (at runtime).

mi做错了什么?

/Chapters/Chapter
   [contains(Name,'Introduction') 
  and 
   contains(Heads/Head/No,'1')
   ]
     /Heads/Head/Title

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

fn:contains($arg1 as xs:string?, $arg2 as xs:string?) as xs:boolean tests如果字符串$arg2包含在$arg1 它期望每个参数的单个字符串(或空值() )。

路径步骤(此处: Heads/Head/Title )返回所有适合的元素,因此所有头部的所有标题。 如果删除章节“简介”的第二个头,则查询将成功运行。

contains是错误的方法。 =比较一组语义。 使用John的解决方案或更接近你的解决方案(但John可能会更快):

/Chapters/Chapter[Name='Introduction' and Heads/Head/No='1']/Heads/Head/Title

这个可以解决目的

/Chapters/Chapter[Name='Introduction']/Heads/Head[No='1']/Title

但我无法回答你的问题...即我无法解释为什么你的查询导致错误!

只是为了完整性和其他人应对同样问题的后续行动:

您的代码将无法正常工作,因为已经指出contains不接受一系列字符串作为其第一个参数。

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

这些所谓的量化表达式some $var in expr every $var in expr )是一种表达您实际行为的简洁方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM