如何让 XQuery 提取 XML 文档中的所有匹配节点
How do I get XQuery to extract all the matching nodes in an XML Document
我是 XQuery 的新手,知道这可能是一个简单的答案,但我就是无法理解这个问题。
我有一个 XML 文件,如下所示:
<EventLog>
<SongSet>
<Song SongID="S002">
<Title>Band on the Run</Title>
<Composer>Paul McCartney</Composer>
<Duration>1.15</Duration>
</Song>
<Song SongID="S003">
<Title>Come on Over</Title>
<Composer>Shania Twain</Composer>
<Duration>3.15</Duration>
</Song>
</SongSet>
<ContestantSet>
<Contestant Name="Randy Stuss" Hometown="Ottawa">
<Repertoire>
<SongRef>S002</SongRef>
<SongRef>S003</SongRef>
</Repertoire>
</Contestant>
<Contestant Name="Fletcher Gee" Hometown="Toronto">
<Repertoire>
<SongRef>S002</SongRef>
<SongRef>S003</SongRef>
</Repertoire>
</Contestant>
</ContestantSet>
</EventLog>
我需要这样的输出:
<songs>
<song>
<name> SONG NAME1 </name>
<composer> COMPOSER NAME </composer>
<singers>
<singer>Singer1 Name </singer>
<singer>Singer2 Name </singer>
</singers>
</song>
<songs>
除了把歌手的名字放在一起,我可以做所有的事情。我的输出如下所示:
<Songs
<Song>
<Title>Band on the Run</Title>
<Composer>Paul McCartney</Composer>
<Singers>
<Singer>Fletcher Gee</Singer>
</Singers>
</Song>
<Song>
<Title>Band on the Run</Title>
<Composer>Paul McCartney</Composer>
<Singers>
<Singer>Randy Stuss</Singer>
</Singers>
</Song>
</Songs>
这是我的 XQuery 代码:
for $x in //SongSet/Song
for $y in //ContestantSet/Contestant
where $x/@SongID = $y/Repertoire/SongRef
return <Song><Title>{data($x/Title)}</Title>
<Composer>{data($x/Composer)}</Composer>
<Singers><Singer>{data($y/@Name)}</Singer></Singers></Song>
我哪里错了?
感谢您的帮助!!!
一种可能的方式;遍历 <Song>
个元素,然后 return <Singers>
部分遍历匹配的 <Contestant>
个元素:
for $x in //SongSet/Song
return <Song><Title>{data($x/Title)}</Title>
<Composer>{data($x/Composer)}</Composer>
<Singers>{for $y in //ContestantSet/Contestant[Repertoire/SongRef = $x/@SongID]
return <Singer>{data($y/@Name)}</Singer>}</Singers></Song>
当针对有问题的 XML 进行测试时,输出符合预期:
<?xml version="1.0" encoding="UTF-8"?>
<Song>
<Title>Band on the Run</Title>
<Composer>Paul McCartney</Composer>
<Singers>
<Singer>Randy Stuss</Singer>
<Singer>Fletcher Gee</Singer>
</Singers>
</Song>
<Song>
<Title>Come on Over</Title>
<Composer>Shania Twain</Composer>
<Singers>
<Singer>Randy Stuss</Singer>
<Singer>Fletcher Gee</Singer>
</Singers>
</Song>
我是 XQuery 的新手,知道这可能是一个简单的答案,但我就是无法理解这个问题。
我有一个 XML 文件,如下所示:
<EventLog>
<SongSet>
<Song SongID="S002">
<Title>Band on the Run</Title>
<Composer>Paul McCartney</Composer>
<Duration>1.15</Duration>
</Song>
<Song SongID="S003">
<Title>Come on Over</Title>
<Composer>Shania Twain</Composer>
<Duration>3.15</Duration>
</Song>
</SongSet>
<ContestantSet>
<Contestant Name="Randy Stuss" Hometown="Ottawa">
<Repertoire>
<SongRef>S002</SongRef>
<SongRef>S003</SongRef>
</Repertoire>
</Contestant>
<Contestant Name="Fletcher Gee" Hometown="Toronto">
<Repertoire>
<SongRef>S002</SongRef>
<SongRef>S003</SongRef>
</Repertoire>
</Contestant>
</ContestantSet>
</EventLog>
我需要这样的输出:
<songs>
<song>
<name> SONG NAME1 </name>
<composer> COMPOSER NAME </composer>
<singers>
<singer>Singer1 Name </singer>
<singer>Singer2 Name </singer>
</singers>
</song>
<songs>
除了把歌手的名字放在一起,我可以做所有的事情。我的输出如下所示:
<Songs
<Song>
<Title>Band on the Run</Title>
<Composer>Paul McCartney</Composer>
<Singers>
<Singer>Fletcher Gee</Singer>
</Singers>
</Song>
<Song>
<Title>Band on the Run</Title>
<Composer>Paul McCartney</Composer>
<Singers>
<Singer>Randy Stuss</Singer>
</Singers>
</Song>
</Songs>
这是我的 XQuery 代码:
for $x in //SongSet/Song
for $y in //ContestantSet/Contestant
where $x/@SongID = $y/Repertoire/SongRef
return <Song><Title>{data($x/Title)}</Title>
<Composer>{data($x/Composer)}</Composer>
<Singers><Singer>{data($y/@Name)}</Singer></Singers></Song>
我哪里错了?
感谢您的帮助!!!
一种可能的方式;遍历 <Song>
个元素,然后 return <Singers>
部分遍历匹配的 <Contestant>
个元素:
for $x in //SongSet/Song
return <Song><Title>{data($x/Title)}</Title>
<Composer>{data($x/Composer)}</Composer>
<Singers>{for $y in //ContestantSet/Contestant[Repertoire/SongRef = $x/@SongID]
return <Singer>{data($y/@Name)}</Singer>}</Singers></Song>
当针对有问题的 XML 进行测试时,输出符合预期:
<?xml version="1.0" encoding="UTF-8"?>
<Song>
<Title>Band on the Run</Title>
<Composer>Paul McCartney</Composer>
<Singers>
<Singer>Randy Stuss</Singer>
<Singer>Fletcher Gee</Singer>
</Singers>
</Song>
<Song>
<Title>Come on Over</Title>
<Composer>Shania Twain</Composer>
<Singers>
<Singer>Randy Stuss</Singer>
<Singer>Fletcher Gee</Singer>
</Singers>
</Song>