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

求助:使用xmlstarlet时无法运用XSL变量实现指定HTML输出

解决XSL生成指定HTML的问题

问题分析

你的XSL代码存在几个关键错误:

  • <xsl:value-of>标签未闭合,XML/XSL要求所有标签必须闭合
  • 变量pc的定义中错误地包含了<span>元素,变量应仅存储数据值而非结构
  • 在遍历<person>时,选择<day>的路径错误,当前上下文是<person>,需通过../day访问同级的<day>元素

正确解决方案

首先确保你的XML有合法的根节点(XML必须包含唯一根元素),示例XML如下:

<root>
  <person pcode="sherry-smith">Sherry Smith</person>
  <day>14</day>
</root>

对应的正确XSL样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" indent="yes"/>

  <xsl:template match="/">
    <xsl:for-each select="root/person">
      <!-- 提取pcode属性值 -->
      <xsl:variable name="pcode" select="@pcode"/>
      <!-- 提取同级day元素的值 -->
      <xsl:variable name="day" select="../day"/>
      <!-- 拼接span的id值 -->
      <xsl:variable name="span-id" select="concat($pcode, '-', $day)"/>
      
      <!-- 生成目标span元素,使用属性值模板插入变量 -->
      <span id="{$span-id}" onClick="getFile('{$pcode}','{$span-id}')">
        <xsl:value-of select="."/>
      </span>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

关键说明

  1. concat()函数:用于拼接字符串,比嵌套<xsl:value-of>更简洁规范
  2. 属性值模板:使用{$变量名}可以直接在HTML属性中插入变量值,无需额外的<xsl:value-of>
  3. 路径选择:../day表示当前<person>元素的父节点下的<day>元素,确保正确获取同级节点的值

执行命令(xmlstarlet)

将样式表保存为transform.xsl,XML保存为input.xml,执行以下命令:

xmlstarlet tr transform.xsl input.xml

执行后将输出你需要的HTML代码。

内容的提问来源于stack exchange,提问作者Ed S.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 21:23:13