XSLT-1.0:如何按顺序获取title文本与子元素artist的属性值
问题分析与解决方法
你的原模板存在两个核心问题:
- 匹配目标错误:仅匹配
title/artist元素,无法处理title中文本节点与artist的顺序关系,导致内容拼接逻辑混乱。 - 路径写法错误:
../title/text()是无效路径,../已经指向title节点,正确写法应为../text(),但即便修正,也无法按原顺序组合artist与文本内容。
正确的XSLT-1.0实现
以下代码会严格遵循XML中title子节点的原有顺序,将artist的artistid属性与文本内容组合,生成符合要求的输出:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"> <!-- 过滤XML中因缩进产生的无效空白文本节点 --> <xsl:strip-space elements="*"/> <!-- 处理根节点,遍历所有data元素 --> <xsl:template match="/"> <xsl:apply-templates select="data"/> </xsl:template> <!-- 匹配data元素,生成fo:block容器 --> <xsl:template match="data"> <fo:block> <!-- 先按顺序拼接所有内容,再统一清理多余空格 --> <xsl:variable name="raw-content"> <xsl:apply-templates select="title/node()"/> </xsl:variable> <xsl:value-of select="normalize-space($raw-content)"/> </fo:block> <!-- 添加空行分隔不同的fo:block --> <xsl:text> </xsl:text> </xsl:template> <!-- 匹配artist元素,输出其artistid属性并添加分隔空格 --> <xsl:template match="title/artist"> <xsl:value-of select="@artistid"/> <xsl:text> </xsl:text> </xsl:template> <!-- 匹配title下的文本节点,输出内容并添加分隔空格 --> <xsl:template match="title/text()"> <xsl:value-of select="."/> <xsl:text> </xsl:text> </xsl:template> </xsl:stylesheet>
代码说明
<xsl:strip-space elements="*"/>:移除XML中因缩进产生的空白文本节点,避免输出出现多余空格。- 匹配
data元素生成fo:block,通过<xsl:apply-templates select="title/node()"/>按原顺序处理title下的所有子节点(文本和artist)。 - 为
artist和文本节点分别编写模板:artist输出artistid属性,文本节点输出自身内容,两者都添加一个空格用于内容分隔。 - 最后用
normalize-space($raw-content)统一清理拼接后的多余空格,保证输出格式整洁规范。
内容的提问来源于stack exchange,提问作者priyanka manogaran
相关产品推荐
相关产品推荐

