如何为<、>应用disable-output-escaping='yes'并排除&
XSLT部分实体转义处理方案
问题说明
需要处理包含<、>和&实体引用的文本:
- 要求
<和>转义后输出为实体字符(即<转成<,>转成>) - 但
&必须保留&的转义形式,不能转成&,因为输出要作为另一XSLT转换的输入
给定内容
变量定义:
<xsl:variable name="text" select="'<span>some text &amp; <span>'"/>
尝试的代码:
<xsl:value-of select="$text" disable-output-escaping="yes"/>
当前输出:
<span>some text & <span>
期望输出:
<span>some text & <span>
解决方案
不能全局使用disable-output-escaping="yes",否则会把所有实体都转成对应字符(包括&转成&)。可以通过<xsl:analyze-string>针对性处理<和>的转义,同时保留&的转义状态:
<xsl:analyze-string select="$text" regex="&(lt|gt);"> <xsl:matching-substring> <xsl:choose> <xsl:when test="regex-group(1)='lt'"> <xsl:text><</xsl:text> </xsl:when> <xsl:when test="regex-group(1)='gt'"> <xsl:text>></xsl:text> </xsl:when> </xsl:choose> </xsl:matching-substring> <xsl:non-matching-substring> <xsl:value-of select="."/> </xsl:non-matching-substring> </xsl:analyze-string>
原理说明
- 用正则匹配
<和>,将它们分别替换为<和> - 其他内容(包括
&amp;)直接输出,保留原有转义形式 - 最终输出会符合需求:
<span>标签正常解析,&保留为&
内容的提问来源于stack exchange,提问作者Bakhovuddin Latifjanov
相关产品推荐
相关产品推荐

