原来的问题
输入示例:
<p><span style="font-size: medium">Product description text</span></p>
预期输出:
<p><span style="font-size: medium">Product description text</span></p>
您真正拥有的是双重转义输入,因此disable-output-escaping="yes"
您需要一些方法来进行字符串替换,而不是简单地输出文本。显然,您似乎使用ew:replacestring()
扩展功能进行了替换。问题是,即使您设法替换&lt;
为<
,结果仍然只是一个字符串,并且该<
字符在输出时被转义。
您的原始替换文本代码格式不正确,因为<
它被视为标记。使用
<xsl:variable name="lt">
<xsl:text><![CDATA[<]]></xsl:text>
</xsl:variable>
或者
<xsl:variable name="lt">
<xsl:text><</xsl:text>
</xsl:variable>
是等效的并解决该问题。但是,这对替换字符仍作为实体引用输出的问题没有帮助。在变量定义中使用disable-output-escaping="yes"
这里也对该问题没有影响。
<xsl:variable name="lt">
<xsl:text disable-output-escaping="yes"><</xsl:text>
</xsl:variable>
<xsl:variable name="lt">
<xsl:value-of select="<" disable-output-escaping="yes">
</xsl:variable>
这些代码示例不起作用,因为disable-output-escaping="yes"
仅在值被序列化时才有效,而不是在分配变量时。
一个可能的修复
您可以尝试做的是将文本替换的结果存储到变量中
<xsl:variable name="replaced-text">
<xsl:copy-of select="ew:replacestring(products_description/node(),$lthex,$lt)"/>
</xsl:variable>
然后输出这个变量的值disable-output-escaping="yes"
<xsl:value-of select="$replaced-text" disable-output-escaping="yes"/>
另一种没有扩展功能的解决方案
我能够改变你的输入
&lt;p&gt;&lt;span style=&quot;font-size: medium&quot;&gt;Product description text&lt;/span&gt;&lt;/p&gt;
到这个输出
<p><span style="font-size: medium">Product description text</span></p>
带有Jeni Tennison 的首字母缩写词替换模板的略微修改版本。在您的情况下,包含首字母缩略词标题的文档将如下所示
<acronyms>
<acronym acronym="&lt;"><</acronym>
<acronym acronym="&gt;">></acronym>
<acronym acronym="&amp;">&</acronym>
<acronym acronym="&apos;">'</acronym>
<acronym acronym="&quot;">"</acronym>
</acronyms>
所需的修改是更改代码示例的这一部分
<acronym title="{$acronyms[1]}">
<xsl:value-of select="$acronym" />
</acronym>
看起来像这样
<xsl:value-of select="$acronyms[1]" disable-output-escaping="yes"/>
该模板应该适用于所有环境,因为它是 XSLT 1.0,并且不需要任何扩展功能。