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

如何使用XSLT将li元素内文本包裹为p标签,现有代码不生效如何解决

XSL转换问题修复方案

原有代码的问题

你写的XSL存在4个核心错误,导致无法达到预期效果:

  • 全局通用匹配模板使用了xsl:copy-of,该操作会直接深拷贝当前节点的所有内容,不会触发子节点的模板匹配规则,你写的li元素匹配逻辑完全不会生效。
  • li匹配模板没有保留原有的<li>标签本身,就算规则触发,也只会输出<p>标签,丢失外层的<li>结构。
  • 空内容的<li>没有对应的处理逻辑,会被直接丢弃,无法保留在输出结果中。
  • 使用xsl:value-of读取li内容仅能提取纯文本,如果<li>内部存在其他内嵌HTML标签,会全部丢失。

修正后的完整XSL代码

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- 身份转换模板:复制所有节点和属性,同时触发子节点的模板匹配 -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <!-- 处理li元素逻辑 -->
    <xsl:template match="li">
        <xsl:copy>
            <xsl:choose>
                <!-- 非空li内容套p标签 -->
                <xsl:when test="normalize-space(.) != ''">
                    <p>
                        <xsl:apply-templates select="node()"/>
                    </p>
                </xsl:when>
                <!-- 空li直接保留原有内容 -->
                <xsl:otherwise>
                    <xsl:apply-templates select="node()"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

改动说明

  • 替换原有全局模板为标准身份转换模板,既保留原有的节点结构,又能触发自定义的li匹配规则。
  • li处理逻辑中先复制<li>标签本身,保证外层结构不丢失。
  • 增加空<li>的处理分支,保留原有的空<li>结构。
  • 用xsl:apply-templates处理li的子节点,兼容li内部存在内嵌标签的场景,不会丢失原有结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:18:03