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

XSLT转换问题:提取TrackList下所有Track子元素及子节点

解决XSLT转换时仅提取第一个Track元素的问题

你的问题出在当前的XSLT模板逻辑上:你匹配了TrackList节点,但在模板里只生成了一个Track元素,而且Track/Title在TrackList的上下文下只会返回第一个Track下的Title内容,这就导致只有第一个元素被处理,其余都被忽略了。

原XML结构

<TrackList> 
  <Track no="1"> 
    <Title>Tin Man</Title> 
  </Track> 
  <Track no="2"> 
    <Title>Good Ol Days</Title> 
  </Track> 
  <Track no="3"> 
    <Title>Thing That Break</Title> 
  </Track> 
</TrackList>

期望输出

<TrackList> 
  <Track title="Tin Man"/> 
  <Track title="Good Ol Days"/> 
  <Track title="Thing That Break"/> 
</TrackList>

正确的XSLT实现

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!-- 匹配根节点,先输出TrackList容器 -->
  <xsl:template match="/">
    <TrackList>
      <!-- 对每个Track节点应用模板,实现遍历处理 -->
      <xsl:apply-templates select="TrackList/Track"/>
    </TrackList>
  </xsl:template>

  <!-- 匹配单个Track节点,处理每个Track的转换逻辑 -->
  <xsl:template match="Track">
    <!-- 创建新的Track元素 -->
    <Track>
      <!-- 将当前Track下的Title内容作为title属性值 -->
      <xsl:attribute name="title">
        <xsl:value-of select="Title"/>
      </xsl:attribute>
    </Track>
  </xsl:template>
</xsl:stylesheet>

逻辑解释

  1. 先匹配根节点/,创建外层的TrackList容器,再通过xsl:apply-templates select="TrackList/Track"遍历所有Track节点,让每个Track都能被单独处理。
  2. 针对单个Track节点的模板中,select="Title"的上下文是当前Track节点,所以能精准获取每个Track下对应的Title内容,生成带正确属性的Track元素。

如果需要保留原Track的no属性,只需在模板里添加<xsl:copy-of select="@no"/>即可,可根据实际需求灵活调整。

内容的提问来源于stack exchange,提问作者sh1nen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:35:33