如何使用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
相关产品推荐
相关产品推荐

