如何比较xml文件中的两个元素?

如何比较xml文件中的两个元素?,xml,xquery,Xml,Xquery,因此,我有以下xml文件: <!DOCTYPE music SYSTEM "music.dtd"> <music> <songs> <song sid = "s1" time = "2:04" year = "1994"> <title>Thriller </title> <artist>Michael </artist> <composers>

因此,我有以下xml文件:

<!DOCTYPE music SYSTEM "music.dtd">
<music>
 <songs>
   <song sid = "s1" time = "2:04" year = "1994">
     <title>Thriller </title>
     <artist>Michael </artist>
       <composers>
          <composer>Michael</composer> 
       </composers>
     <album> Thriller album</album>
    </song>
   <song sid = "s2" time = "2:00" year = "1999">
     <title> Billy </title>
     <artist> Thomas </artist>
     <composers>
       <composer> Rick </composer> 
     </composers>
     <album> The one </album>
    </song>
    <song sid = "s3" time = "1:50" year = "2000">
      <title> Down </title>
      <artist> PJ </artist>
      <composers>
        <composer>Jerry </composer>
      </composers>
      <album>Forty </album>
    </song>
 </songs>
 <playlists>
   <playlist pid = "p1" creator = "Tom">
     <track sid = "s1"/>
   </playlist>
 </playlists>


</music>

惊悚片
迈克尔
迈克尔
惊悚专辑
比利
托马斯
瑞克
那个
向下
PJ
杰瑞
四十
我想做的是从不在播放列表中的歌曲中获取所有sid 因此,在这个xml文件中,我希望返回的查询是sid:s2和s3,因为这两个都不在播放列表中,而且s1在播放列表中,所以不应该返回

我正在尝试使用此查询:

for $x in doc("music.xml")/music/songs/song/@sid
  return <sid>{data($x)}</sid>
文件中的$x(“music.xml”)/music/songs/song/@sid
返回{data($x)}

我试图将结果存储在一个变量中,以便稍后将其与另一个查询进行比较,该查询将遍历播放列表,但我对如何将查询结果存储到变量中有点迷茫。有什么帮助吗?谢谢。

您可以使用
let
子句在查询中绑定变量。下面是一个包含多个中间变量的示例:

let $doc := doc("music.xml")/music
let $in-pl := $doc/playlists/playlist/track
let $not-in-pl := $doc/songs/song[fn:not(@sid = $in-pl/@sid)]
for $x in $not-in-pl/@sid
return <sid>{data($x)}</sid>
也可以使用XQuery元素/属性构造函数:

return
  element noplaylist {
    for $x in $not-in-pl/@sid
    return
      element sid {
        attribute sid { data($x) }
      }
  }
嗯..所以我试了一下:

 for $x in doc("music.xml")/music/songs/song/@sid
  where $x != doc("music.xml")//playlists/playlist/track/@sid
  return <sid>{data($x)}</sid>
文件中的$x(“music.xml”)/music/songs/song/@sid
其中$x!=doc(“music.xml”)//playlists/playlist/track/@sid
返回{data($x)}

我不确定这是否是巧合,但现在有意义了。

这也行!如果要在变量中捕获该表达式的结果,请在其前面添加
let$results:=
,并在其后面添加
return$results
(或其他表达式)。XQuery非常灵活;)看来你的问题被打断了。我该怎么回答呢?谢谢你接受我的回答!我添加了一些元素构造的示例
 for $x in doc("music.xml")/music/songs/song/@sid
  where $x != doc("music.xml")//playlists/playlist/track/@sid
  return <sid>{data($x)}</sid>