【问题标题】:Xquery and starts-withXquery 和开始
【发布时间】:2016-03-17 14:21:07
【问题描述】:

我对 Xquery 有疑问。

我有这个 XML:

<peliculas>
<pelicula fechaEstreno='2007'>
    <titulo>Los Otros</titulo>
    <director>Alejandro Amenabar</director>
</pelicula>
<pelicula fechaEstreno='1986'>
    <titulo>Sangre Facil</titulo>
    <director>Ethan Coen</director>
</pelicula>
<pelicula fechaEstreno='1990'>
    <titulo>No es pais para viejos</titulo>
    <director>Ethan Coen</director>
    <director>Joel Coen</director>
</pelicula>
<pelicula fechaEstreno='2007'>
    <titulo>The Lovely Bones</titulo>
    <director>Peter Jackson</director>
</pelicula>
</peliculas>

我需要显示“导演”以“A”开头的“titulo”。所以我尝试了这个:

for $c in doc('C:\...\pelis.xml') //pelicula
where starts-with($c/director, 'A')
return
<pelicula>
{$c/titulo}
</pelicula>

但我有这个错误:

需要项目,找到序列:(元素导向器 {...},...)。

我以前用过“ends-with”,我认为“starts-with”的语法也很相似,但它不起作用。

我该怎么做?

【问题讨论】:

    标签: xml xquery


    【解决方案1】:

    对于第三个pelicula 元素,XPath $c/director 返回两个元素的序列

    (
      <director>Ethan Coen</director>,
      <director>Joel Coen</director>
    )
    

    另一方面,函数 fn:starts-with(...) 期望空序列或单个项目作为其第一个参数:

    fn:starts-with($arg1 as xs:string?, $arg2 as xs:string?) as xs:boolean
    

    以下是您可以做的示例:

    for $c in doc('C:\...\pelis.xml')//pelicula
    where
        some $director in $c/director
        satisfies starts-with($director, 'A')
    return <pelicula>{
        $c/titulo
    }</pelicula>
    

    使用一些 XPath 技巧,您甚至可以使其简洁:

    for $c in doc('C:\...\pelis.xml')//pelicula[director[starts-with(., 'A')]]
    return <pelicula>{
        $c/titulo
    }</pelicula>
    

    【讨论】:

    • 这比“ends-with”复杂一点……我不知道“some...satisfies”的存在。但它有效。非常感谢。
    • 是什么让您认为fn:ends-with(...) 的工作方式不同?它也不允许多个项目的序列。我将在我的答案中添加一个使用 XPath 谓词的更简洁的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多