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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 22:42:41