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>
逻辑解释
- 先匹配根节点
/,创建外层的TrackList容器,再通过xsl:apply-templates select="TrackList/Track"遍历所有Track节点,让每个Track都能被单独处理。 - 针对单个
Track节点的模板中,select="Title"的上下文是当前Track节点,所以能精准获取每个Track下对应的Title内容,生成带正确属性的Track元素。
如果需要保留原Track的no属性,只需在模板里添加<xsl:copy-of select="@no"/>即可,可根据实际需求灵活调整。
内容的提问来源于stack exchange,提问作者sh1nen
相关产品推荐
相关产品推荐

