列出Xquery中电影中的所有演员

时间:2014-11-03 13:30:37

标签: xml xpath xquery exist-db

我想列出我在eXist-db / XML数据库中获得的每部电影的所有演员。我创建了movies.xmlactors.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>

XML的内容

谨防结构不良。

/* 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>

1 个答案:

答案 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而不是完整元素是很常见的。

此外,由于我们不知道您的应用程序或您正在做什么,我们无法建议您是否要在您的名字周围添加演员元素。此外,它主要是个人品味的问题,虽然我更喜欢名字周围的分组元素。两种解决方案都是可能的。