在使用XQuery指定歌曲ID时,如何查找歌曲的持续时间?

在使用XQuery指定歌曲ID时,如何查找歌曲的持续时间?,xquery,Xquery,首先,是的,这是家庭作业-请指出我哪里出了问题,但请不要替我做家庭作业 我正在学习XQuery,我的任务之一是获取一个演出的歌曲ID列表,并确定演出的总持续时间。考虑到下面的问题,有人能告诉我在哪里可以确定如何将songID从表演中交叉引用到歌曲的持续时间吗 我在问题的末尾列出了我的尝试 我当前的XQuery代码如下所示: let $songIDs := doc("C:/Users/rob/Downloads/A4_FLOWR.xml") //So

首先,是的,这是家庭作业-请指出我哪里出了问题,但请不要替我做家庭作业

我正在学习XQuery,我的任务之一是获取一个演出的歌曲ID列表,并确定演出的总持续时间。考虑到下面的问题,有人能告诉我在哪里可以确定如何将songID从表演中交叉引用到歌曲的持续时间吗

我在问题的末尾列出了我的尝试

我当前的XQuery代码如下所示:

   let $songIDs := doc("C:/Users/rob/Downloads/A4_FLOWR.xml")
                     //SongSet/Song 
   for $performance in doc("C:/Users/rob/Downloads/A4_FLOWR.xml")
                       //ContestantSet/Contestant/Performance
      return if($performance/SongRef[. =$songIDs/@SongID])   
      then <performanceDuration>{ 
             data($performance/SongRef)
           }</performanceDuration>
      else ()
let$songIDs:=doc(“C:/Users/rob/Downloads/A4_flower.xml”)
//歌曲集/歌曲
对于$performance文件(“C:/Users/rob/Downloads/A4_flower.xml”)
//选手组/选手/表演
如果($performance/SongRef[.=$songIDs/@SongID]),则返回
然后{
数据($performance/SongRef)
}
else()
哪些产出:

  <performanceDuration>S005 S003 S004</performanceDuration>
  <performanceDuration>S001 S007 S002</performanceDuration>
  <performanceDuration>S008 S009 S006</performanceDuration>
  <performanceDuration>S002 S004 S007</performanceDuration>
S005 S003 S004
S001 S007 S002
S008 S009 S006
S002 S004 S007
每个S00x是一首歌曲的ID,我们可以在引用的xml文档(部分文档)中找到它:


Bah Bah害群之马
母鹅
2.99
谢谢你,宝贝
莎妮娅·吐温
3.02
性能部分如下所示:

 <Contestant Name="Fletcher Gee" Hometown="Toronto">
    <Repertoire>
      <SongRef>S001</SongRef>
      <SongRef>S002</SongRef>
      <SongRef>S007</SongRef>
      <SongRef>S010</SongRef>
    </Repertoire>
    <Performance>
      <SongRef>S001</SongRef>
      <SongRef>S007</SongRef>
      <SongRef>S002</SongRef>
    </Performance>
    </Contestant>

S001
S002
S007
S010
S001
S007
S002
我的尝试

我原以为我会使用嵌套循环,但这失败了:

 let $songs := doc("C:/Users/rob/Downloads/A4_FLOWR.xml")
               //SongSet/Song 
   for $performance in doc("C:/Users/rob/Downloads/A4_FLOWR.xml")
                       //ContestantSet/Contestant/Performance
   return if($performance/SongRef[. =$songs/@SongID])   
     for $song in $songIDs 
          (: gives an error in BaseX about incomplete if :)
   then <performanceDuration>{ 
          data($performance/SongRef)
        }</performanceDuration>
   else ()
let$songs:=doc(“C:/Users/rob/Downloads/A4_flower.xml”)
//歌曲集/歌曲
对于$performance文件(“C:/Users/rob/Downloads/A4_flower.xml”)
//选手组/选手/表演
如果($performance/songf[.=$songs/@SongID]),则返回
对于$SONGID中的$song
(:在BaseX中给出了一个关于不完整的错误,如果:)
然后{
数据($performance/SongRef)
}
else()
--编辑--

我已经修复了内部循环,但是我得到了所有歌曲的持续时间,而不仅仅是那些匹配id的。我觉得这是由于可变范围造成的,但我不确定:

 let $songs := doc("C:/Users/rob/Downloads/A4_FLOWR.xml")//SongSet/Song 
   for $performance in doc("C:/Users/rob/Downloads/A4_FLOWR.xml")//ContestantSet/Contestant/Performance
   return if($performance/SongRef[. =$songs/@SongID])   

   then <performanceDuration>{  
     for $song in $songs
     return if($performance/SongRef[. =$songs/@SongID]) 
     then      
      sum($song/Duration)
     else ()
  }</performanceDuration>
   else ()

}
let$songs:=doc(“C:/Users/rob/Downloads/A4_flower.xml”)//SongSet/Song
对于$performance文件(“C:/Users/rob/Downloads/A4_flower.xml”)//competitiveset/competite/performance
如果($performance/songf[.=$songs/@SongID]),则返回
然后{
在$songs中输入$song
如果($performance/songf[.=$songs/@SongID]),则返回
然后
总额(首歌/时长)
else()
}
else()
}
输出:

<performanceDuration>2.99 1.15 3.15 2.2 3.02 2.25 3.45 1.29 2.33 3.1</performanceDuration>
2.99 1.15 3.15 2.2 3.02 2.25 3.45 1.29 2.33 3.1

您眼前的问题是语法:您在条件和条件中的关键字“then”之间插入了内部循环。首先解决这个问题:

return if ($performance/SongRef = $songs/@SongID) then
          <performanceDuration>{
             (: put your inner loop HERE :)
          }</performanceDuration>
else ()
如果($performance/SongRef=$songs/@SongID)则返回
{
(:将内部循环放在此处:)
}
else()
现在考虑一下PerformanceEduation元素中查询计算器的情况。您有变量$performance,可以使用$performance/songf查找所有歌曲引用,对于performance元素中的每个歌曲引用,您可以通过将songf值与$songs/@SongID匹配来查找相应的歌曲元素

在这一点上,我的下一步是问自己:

  • 对于给定的歌曲引用,如何查找该歌曲的歌曲元素,以及该歌曲的持续时间
  • 有没有办法得到某组持续时间的总和?例如,是否有一个
    sum()
    函数?(我很确定有,但在这一点上,我总是调出函数和操作符规范并查找它以确保签名。)
  • 持续时间信息的类型是什么?我希望它是分和秒,我会担心持续时间算法,但您的示例使它看起来像小数,这很简单

您眼前的问题是语法:您在条件和条件中的关键字“then”之间插入了内部循环。首先解决这个问题:

return if ($performance/SongRef = $songs/@SongID) then
          <performanceDuration>{
             (: put your inner loop HERE :)
          }</performanceDuration>
else ()
如果($performance/SongRef=$songs/@SongID)则返回
{
(:将内部循环放在此处:)
}
else()
现在考虑一下PerformanceEduation元素中查询计算器的情况。您有变量$performance,可以使用$performance/songf查找所有歌曲引用,对于performance元素中的每个歌曲引用,您可以通过将songf值与$songs/@SongID匹配来查找相应的歌曲元素

在这一点上,我的下一步是问自己:

  • 对于给定的歌曲引用,如何查找该歌曲的歌曲元素,以及该歌曲的持续时间
  • 有没有办法得到某组持续时间的总和?例如,是否有一个
    sum()
    函数?(我很确定有,但在这一点上,我总是调出函数和操作符规范并查找它以确保签名。)
  • 持续时间信息的类型是什么?我希望它是分和秒,我会担心持续时间算法,但您的示例使它看起来像小数,这很简单