求助:使用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>
关键说明
concat()函数:用于拼接字符串,比嵌套<xsl:value-of>更简洁规范- 属性值模板:使用
{$变量名}可以直接在HTML属性中插入变量值,无需额外的<xsl:value-of> - 路径选择:
../day表示当前<person>元素的父节点下的<day>元素,确保正确获取同级节点的值
执行命令(xmlstarlet)
将样式表保存为transform.xsl,XML保存为input.xml,执行以下命令:
xmlstarlet tr transform.xsl input.xml
执行后将输出你需要的HTML代码。
内容的提问来源于stack exchange,提问作者Ed S.
相关产品推荐
相关产品推荐

