我想列出我在eXist-db / XML数据库中获得的每部电影的所有演员。我创建了movies.xml
和actors.xml
。 (内容最后粘贴。)
到目前为止,我的Xquery如下所示,结果是将一个演员和一部电影一起列出,正确的" join",但是我要列出一部电影,然后是其中的所有演员。我已经写了我想要的东西,但我不确定它是否是一个好的输出。它似乎是我用于MySQL的最自然的。
for $movie in doc('db/movies/movies.xml')//movie,
$actor in doc('db/movies/actors.xml')//actor
where $actor/@id = $movie/actors/actor
return <movact>
{$actor//name}
{$movie//title}
</movact>
我的结果到目前为止
<movact>
<name>Dan</name>
<title>Harry Putter</title>
</movact>
<movact>
<name>Dan</name>
<title>Star Cars</title>
</movact>
<movact>
<name>John</name>
<title>Star Cars</title>
</movact>
<movact>
<name>Mary</name>
<title>Star Cars</title>
</movact>
我多么想要
<movact>
<title>Harry Putter</title>
<name>Dan</name>
</movact>
<movact>
<title>Star Cars</title>
<!-- Should the <name>s be surrounded by an <actor>-tag? -->
<name>Dan</name>
<name>John</name>
<name>Mary</name>
</movact>
谨防结构不良。
/* movies.xml */
<?xml version="1.0"?>
<movies>
<movie id="1">
<title>Harry Putter</title>
<year>2005</year>
<actors>
<actor>1</actor>
</actors>
</movie>
<movie id="2">
<title>Star Cars</title>
<year>1998</year>
<actors>
<actor>1</actor>
<actor>2</actor>
<actor>3</actor>
</actors>
</movie>
</movies>
/* actors.xml */
<?xml version="1.0"?>
<actors>
<actor id="1">
<name>Dan</name>
<gender>Male</gender>
</actor>
<actor id="2">
<name>John</name>
<gender>Male</gender>
</actor>
<actor id="3">
<name>Mary</name>
<gender>Female</gender>
</actor>
</actors>
答案 0 :(得分:3)
基本上你想用actor名称替换actor ID。因此,只需为每个ID执行for循环并返回相应的actor名称。以下应该做你想做的事。
for $movie in doc('db/movies/movies.xml')//movie
return <movact>
{$movie/title}
{
for $id in $movie/actors/actor
let $actor := doc('db/movies/actors.xml')//actor[@id = $id]
return $actor/name
}
</movact>
关于你的问题中的一些评论:给定的XML在任何方面都不错。实际上,存储一些ID而不是完整元素是很常见的。
此外,由于我们不知道您的应用程序或您正在做什么,我们无法建议您是否要在您的名字周围添加演员元素。此外,它主要是个人品味的问题,虽然我更喜欢名字周围的分组元素。两种解决方案都是可能的。