You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:47:20