基于XSLT按子节点排序XML:提取指定歌曲并按rank_song排序
提取并排序带排名的歌曲(XSLT实现)
我帮你写了一段针对性的XSLT代码,可以从你的XML文档里提取所有带rank_song的歌曲,关联对应的专辑和乐队名称,并且按排名数值升序排序。
先补全你的XML示例(方便测试)
<?xml version='1.0' encoding='UTF-8' standalone="yes"?> <!DOCTYPE soundvisor SYSTEM "soundvisor.dtd"> <soundvisor> <groups> <group name_g='ACDC'> <city>Sidney</city> <country>Australia</country> <year_born>1973</year_born> <albums> <album name_a='Back in Black'> <year>1980</year> <songs> <song name_s='Hells Bells'> <rank_song>1</rank_song> </song> <song name_s='Back in Black'> <rank_song>2</rank_song> </song> </songs> </album> <album name_a='Highway to Hell'> <year>1979</year> <songs> <song name_s='Highway to Hell'> <rank_song>3</rank_song> </song> </songs> </album> </albums> </group> <group name_g='Led Zeppelin'> <city>London</city> <country>UK</country> <year_born>1968</year_born> <albums> <album name_a='IV'> <year>1971</year> <songs> <song name_s='Stairway to Heaven'> <rank_song>1</rank_song> </song> </songs> </album> </albums> </group> </groups> </soundvisor>
对应的XSLT代码
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 匹配根节点,生成输出的根标签 --> <xsl:template match="/soundvisor"> <ranked_songs> <!-- 筛选所有带rank_song的歌曲,按排名数值升序排序 --> <xsl:apply-templates select="groups/group/albums/album/songs/song[rank_song]"> <xsl:sort select="rank_song" data-type="number" order="ascending"/> </xsl:apply-templates> </ranked_songs> </xsl:template> <!-- 处理每个符合条件的歌曲节点,输出关联信息 --> <xsl:template match="song"> <song_entry> <band_name><xsl:value-of select="../../../@name_g"/></band_name> <album_name><xsl:value-of select="../../@name_a"/></album_name> <song_name><xsl:value-of select="@name_s"/></song_name> <rank><xsl:value-of select="rank_song"/></rank> </song_entry> </xsl:template> </xsl:stylesheet>
关键细节说明
- 过滤逻辑:用
song[rank_song]确保只处理带有排名的歌曲,忽略没有rank_song节点的条目 - 排序规则:指定
data-type="number"是为了避免字符串排序的坑(比如"10"不会排在"2"前面) - 路径关联:通过相对XPath路径从歌曲节点向上回溯,获取乐队(
../../../@name_g)和专辑(../../@name_a)的名称
转换后的输出结果
<?xml version="1.0" encoding="UTF-8"?> <ranked_songs> <song_entry> <band_name>ACDC</band_name> <album_name>Back in Black</album_name> <song_name>Hells Bells</song_name> <rank>1</rank> </song_entry> <song_entry> <band_name>Led Zeppelin</band_name> <album_name>IV</album_name> <song_name>Stairway to Heaven</song_name> <rank>1</rank> </song_entry> <song_entry> <band_name>ACDC</band_name> <album_name>Back in Black</album_name> <song_name>Back in Black</song_name> <rank>2</rank> </song_entry> <song_entry> <band_name>ACDC</band_name> <album_name>Highway to Hell</album_name> <song_name>Highway to Hell</song_name> <rank>3</rank> </song_entry> </ranked_songs>
内容的提问来源于stack exchange,提问作者xavier
相关产品推荐
相关产品推荐

