>更新:
尽管与以前不完全相同,但问题仍然存在。下面是一个示例,说明正在输入的内容,正在输出的内容以及我想要输出的内容
输入示例:
<p><span style="font-size: medium">Product description text</span></p>
电流输出:
<p><span style="font-size: medium">Product description text</span></p>
预期输出:
<p><span style="font-size: medium">Product description text</span></p>
.
使用CDATA 很有帮助,因为它允许我输入"<",但如上面的输出所示,即使使用禁用输出转义,它在输出中也发生了变化
.
.
原始问题:
我得到的错误是"'<',十六进制值0x3C,是一个无效的属性字符">
我正在尝试做的是分别用 <和> 替换所有出现的 <和> 。和>和>
为了尽可能简单,以下是 lt; 的代码:
<xsl:variable name="lt">
<xsl:text><</xsl:text>
</xsl:variable>
<xsl:variable name="lthex">&lt;</xsl:variable>
<xsl:copy-of select="ew:replacestring(products_description/node(),$lthex,$lt)"/>
我已经尝试了各种方法来代替文本,例如值等。
我知道代码格式和链接到它的 vb 代码没有任何问题,因为我多次使用它来替换和输出
其他地方不过,这样做的问题是我希望<和>实际上是输出的,而不是然后被浏览器看到并更改的代码和>
.
如果您需要更多信息,请询问(我正在努力很好地解释这一点(
任何帮助将不胜感激
<xsl:text disable-output-escaping="yes"><![CDATA[<]]></xsl:text>
这是因为<
是非法的(这就是您的应用抱怨的原因(。对于>
,您可以使用:
<xsl:text disable-output-escaping="yes">></xsl:text>
原始问题
输入示例:
&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>
您真正拥有的是双重转义输入,因此您不仅需要一些方法来执行字符串替换,而不仅仅是简单地输出带有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,并且不需要任何扩展函数。
编辑:看起来您正在尝试将 XML 或 HTML 序列化的序列化作为输入而不是 XML 或 HTML 序列化,并期望它输出 XML 或 HTML 序列化?
正确的做法是修复损坏的输入,但请参阅如何在 XSLT 的帮助下取消转义 XML 字符?
你在这里有某种误解。XSL 将 XML 作为输入并输出 HTML 或 XML。 <
在序列化的 HTML 和 XML 中表示为<
。
包含不启动标记的<
的 HTML 或 XML 文件是不正确的序列化(格式不正确(。
<
是 HTML 或 XML 文件中<
的正确表示形式。
HTML 或 XML 文件只是它所表示的数据的序列化。也就是说,它比它所表示的数据低一级。你应该把HTML或XML的内容看作是数据所表示的内容(<
(,而不是数据的序列化(<
(。
试着解释为什么你认为有<
是一个问题,这样我们就可以纠正误解?