是否可以在 XQuery 中的 where 子句上使用 OR?
Is it possible to use OR on a where clause in XQuery?
我需要 return 作者 "John Doe" 的书籍和期刊的标题,但我的 xml 文件设置为:
<library>
<book>...</book>
<article>...</article>
</library>
共有6本书籍和期刊。
我知道如果这是 SQL 我可以做类似的事情:
SELECT title
FROM library
WHERE bookauthor = "John Doe" OR articleauthor = "John Doe"
(该数据库不会被规范化,但我试图表明我认为我知道我需要做什么,只是不确定如何使用 XQuery)
我尝试了以下方法,它 return 为我提供了所有 6 个标题:
for $x in doc("xmldata.xml")/library
let $a := $x/article
let $b := $x/book
return ($a/title, $b/title)
但我不确定如何处理 where 子句。同样,我尝试了以下并卡在了同一点:
for $x in doc("xmldata.xml")/library
return ($x/article/title, $x/book/title)
当我尝试添加 where 子句时,它仍然 return 所有 6 个条目,即使它应该只有 return 1 本书和 1 篇文章:
for $x in doc("xmldata.xml")/library
where $x/article/author = 'John Doe'
where $x/book/author = 'John Doe'
return ($x/article/title, $x/book/title)
有人能帮帮我吗?也许通过为我指明正确的方向或指出我哪里出错了。
完整 XML 文件:
<library>
<book>
<author>John Doe</author>
<title>Turnitin</title>
</book>
<article>
<author>John Doe</author>
<title>Evaluating</title>
</article>
<article>
<author>Shannon, L.</author>
<title>Reconceptualising</title>
</article>
<book>
<author>Burden, David</author>
<title>An evaluation</title>
</book>
<article>
<author>Moscrop, C.</author>
<title>Evaluating a systematic method</title>
</article>
<book>
<author>Beaumont, C.</author>
<title>Beyond e-learning</title>
</book>
</library>
抱歉,我错过了您查询的路径。只有一个库元素,所以你的 for
循环只迭代了一次,然后因为 至少有一个 <author>
匹配你的 where
子句,它return编辑了 <library>
中的所有值。
解决方案是在层次结构中向下迭代一级:
for $x in doc("xmldata.xml")/library/*
where $x/author = 'John Doe'
return $x/title
或者如果你想非常清楚你在哪些元素中 select:
for $x in doc("xmldata.xml")/library/(article|book)
...
要控制不同元素的值输出,您可以在 return:
中使用不同的 XPath
...
return ($x/self::book/title, $x/self::article/author)
您可以使用通配符 *
来匹配元素,而不管它们的名称:
doc("xmldata.xml")/library/*[author = 'John Doe']/title
这相当于更详细的 FLWOR 表达式
for $entry in doc("xmldata.xml")/library/*
where $entry/author = 'John Doe'
return $entry/title
我需要 return 作者 "John Doe" 的书籍和期刊的标题,但我的 xml 文件设置为:
<library>
<book>...</book>
<article>...</article>
</library>
共有6本书籍和期刊。
我知道如果这是 SQL 我可以做类似的事情:
SELECT title
FROM library
WHERE bookauthor = "John Doe" OR articleauthor = "John Doe"
(该数据库不会被规范化,但我试图表明我认为我知道我需要做什么,只是不确定如何使用 XQuery)
我尝试了以下方法,它 return 为我提供了所有 6 个标题:
for $x in doc("xmldata.xml")/library
let $a := $x/article
let $b := $x/book
return ($a/title, $b/title)
但我不确定如何处理 where 子句。同样,我尝试了以下并卡在了同一点:
for $x in doc("xmldata.xml")/library
return ($x/article/title, $x/book/title)
当我尝试添加 where 子句时,它仍然 return 所有 6 个条目,即使它应该只有 return 1 本书和 1 篇文章:
for $x in doc("xmldata.xml")/library
where $x/article/author = 'John Doe'
where $x/book/author = 'John Doe'
return ($x/article/title, $x/book/title)
有人能帮帮我吗?也许通过为我指明正确的方向或指出我哪里出错了。
完整 XML 文件:
<library>
<book>
<author>John Doe</author>
<title>Turnitin</title>
</book>
<article>
<author>John Doe</author>
<title>Evaluating</title>
</article>
<article>
<author>Shannon, L.</author>
<title>Reconceptualising</title>
</article>
<book>
<author>Burden, David</author>
<title>An evaluation</title>
</book>
<article>
<author>Moscrop, C.</author>
<title>Evaluating a systematic method</title>
</article>
<book>
<author>Beaumont, C.</author>
<title>Beyond e-learning</title>
</book>
</library>
抱歉,我错过了您查询的路径。只有一个库元素,所以你的 for
循环只迭代了一次,然后因为 至少有一个 <author>
匹配你的 where
子句,它return编辑了 <library>
中的所有值。
解决方案是在层次结构中向下迭代一级:
for $x in doc("xmldata.xml")/library/*
where $x/author = 'John Doe'
return $x/title
或者如果你想非常清楚你在哪些元素中 select:
for $x in doc("xmldata.xml")/library/(article|book)
...
要控制不同元素的值输出,您可以在 return:
中使用不同的 XPath...
return ($x/self::book/title, $x/self::article/author)
您可以使用通配符 *
来匹配元素,而不管它们的名称:
doc("xmldata.xml")/library/*[author = 'John Doe']/title
这相当于更详细的 FLWOR 表达式
for $entry in doc("xmldata.xml")/library/*
where $entry/author = 'John Doe'
return $entry/title