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

XSLT-1.0:如何按顺序获取title文本与子元素artist的属性值

问题分析与解决方法

你的原模板存在两个核心问题:

  1. 匹配目标错误:仅匹配title/artist元素,无法处理title中文本节点与artist的顺序关系,导致内容拼接逻辑混乱。
  2. 路径写法错误:../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>&#10;&#10;</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>

代码说明

  1. <xsl:strip-space elements="*"/>:移除XML中因缩进产生的空白文本节点,避免输出出现多余空格。
  2. 匹配data元素生成fo:block,通过<xsl:apply-templates select="title/node()"/>按原顺序处理title下的所有子节点(文本和artist)。
  3. 为artist和文本节点分别编写模板:artist输出artistid属性,文本节点输出自身内容,两者都添加一个空格用于内容分隔。
  4. 最后用normalize-space($raw-content)统一清理拼接后的多余空格,保证输出格式整洁规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 16:25:25