使用XSLT转换HTML文本为大写时如何保留原有标签层级结构
你现有代码丢失标签结构的原因是,xsl:value-of 只会提取节点的纯文本内容,直接丢弃了所有元素标签,且仅匹配根节点的模板没有处理嵌套的元素层级。
可通过XSLT恒等变换(身份模板)实现保留结构的文本转大写,修复后的完整代码如下:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output encoding="UTF-8" indent="no" method="xhtml" standalone="0" version="1.0"/> <xsl:variable name="smallcase" select="'abcdefghijklmnopqrstuvwxyz'"/> <xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/> <!-- 恒等模板:原样复制所有节点、属性、结构 --> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> <!-- 仅处理文本节点:转换为大写 --> <xsl:template match="text()"> <xsl:value-of select="translate(., $smallcase, $uppercase)"/> </xsl:template> </xsl:transform>
逻辑说明
- 恒等模板会匹配所有元素、属性、注释、处理指令等非文本节点,执行复制操作,完全保留原有的标签层级、属性、结构不变
- 第二个模板仅匹配文本节点,对文本内容执行大小写转换,不会影响其他节点的处理逻辑
- 所有转换完全兼容XSLT 1.0版本,不需要额外依赖
内容的提问来源于stack exchange,提问作者Lorenzo Bellemo
相关产品推荐
相关产品推荐

