如何在XML文件中定义并复用变量?XSLT实践问题求解
问题解决:在XML中定义并复用发言者变量
场景说明
每份文档包含不同发言者(名字、姓氏、昵称、尊称等),这些信息与对应XML文档绑定,无法通用存储在XSLT样式表中。
目标
在XML文件中存储发言者相关数据并实现复用。
问题分析
你之前的实现存在核心错误:输入XML误用了<xsl:stylesheet>作为根节点(这是XSLT样式表的专属根元素),且在普通XML中写入<xsl:copy select="$socrate"/>这类XSLT指令——XSLT语法仅能在样式表中被解析,输入XML不能直接包含这类逻辑,这就是变量调用被忽略的原因。
正确实现方案
1. 重构输入XML结构
将发言者数据作为XML的原生节点存储,通过ID标识实现复用:
<?xml version="1.0" encoding="UTF-8"?> <document> <!-- 集中存储所有发言者数据 --> <speakers> <speaker id="socrate"> <longname>Socrate</longname> <shortname>Soc</shortname> </speaker> </speakers> <!-- 文档内容,通过ID引用发言者 --> <body> <speaker-ref id="socrate"/> </body> </document>
2. 修改XSLT样式表
通过key建立发言者ID索引,快速匹配并输出对应数据:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="html" indent="yes"/> <!-- 建立发言者ID与节点的索引映射 --> <xsl:key name="speaker-by-id" match="speaker" use="@id"/> <!-- 处理文档根节点,仅输出body内容 --> <xsl:template match="/document"> <xsl:apply-templates select="body"/> </xsl:template> <!-- 解析发言者引用节点,输出对应名称 --> <xsl:template match="speaker-ref"> <span class="speaker"> <!-- 可切换longname/shortname输出不同格式 --> <xsl:value-of select="key('speaker-by-id', @id)/longname"/> </span> </xsl:template> <!-- 忽略speakers节点的默认输出,避免冗余内容 --> <xsl:template match="speakers"/> </xsl:stylesheet>
3. 执行结果
运行命令xsltproc stylesheet.xslt example.xml > test.html后,输出的HTML内容为:
<span class="speaker">Socrate</span>
若需要复用短名称,只需将样式表中value-of的路径改为key('speaker-by-id', @id)/shortname即可。
内容的提问来源于stack exchange,提问作者fauve
相关产品推荐
相关产品推荐

