7

更新:

尽管与以前不太一样,但问题仍然存在。下面是输入内容、输出内容和我想要输出的内容的示例

输入示例:

<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">&amp;lt;</xsl:variable>
<xsl:copy-of select="ew:replacestring(products_description/node(),$lthex,$lt)"/>

我尝试了各种代替文本的方法,例如 value-of 等。

我知道代码格式和链接到它的 vb 代码没有问题,因为我多次使用它来替换和输出其他地方

不过,问题在于我希望 < 和 > 字面上输出,而不是浏览器看到并更改的代码

.

如果您需要更多信息,请询问(我很难很好地解释这一点)

任何帮助将不胜感激

4

3 回答 3

11
<xsl:text disable-output-escaping="yes"><![CDATA[<]]></xsl:text>

这是因为<是非法的(这就是您的应用抱怨的原因)。对于>,您可以使用:

<xsl:text disable-output-escaping="yes">></xsl:text>
于 2011-07-12T11:49:22.150 回答
5

原来的问题

输入示例:

&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;font-size: medium&amp;quot;&amp;gt;Product description text&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;

预期输出:

<p><span style="font-size: medium">Product description text</span></p>

您真正拥有的是双重转义输入,因此disable-output-escaping="yes"您需要一些方法来进行字符串替换,而不是简单地输出文本。显然,您似乎使用ew:replacestring()扩展功能进行了替换。问题是,即使您设法替换&amp;lt;<,结果仍然只是一个字符串,并且该<字符在输出时被转义。

您的原始替换文本代码格式不正确,因为<它被视为标记。使用

<xsl:variable name="lt">
  <xsl:text><![CDATA[<]]></xsl:text>
</xsl:variable>

或者

<xsl:variable name="lt">
  <xsl:text>&lt;</xsl:text>
</xsl:variable>

是等效的并解决该问题。但是,这对替换字符仍作为实体引用输出的问题没有帮助。在变量定义中使用disable-output-escaping="yes"这里也对该问题没有影响。

<xsl:variable name="lt">
  <xsl:text disable-output-escaping="yes">&lt;</xsl:text>
</xsl:variable>

<xsl:variable name="lt">
  <xsl:value-of select="&lt;" 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"/>

另一种没有扩展功能的解决方案

我能够改变你的输入

&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;font-size: medium&amp;quot;&amp;gt;Product description text&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;

到这个输出

<p><span style="font-size: medium">Product description text</span></p>

带有Jeni Tennison 的首字母缩写词替换模板的略微修改版本。在您的情况下,包含首字母缩略词标题的文档将如下所示

<acronyms>
    <acronym acronym="&amp;lt;">&lt;</acronym>
    <acronym acronym="&amp;gt;">></acronym>
    <acronym acronym="&amp;amp;">&amp;</acronym>
    <acronym acronym="&amp;apos;">'</acronym>
    <acronym acronym="&amp;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,并且不需要任何扩展功能。

于 2011-07-13T13:25:14.807 回答
0

编辑:看起来您正在尝试将 XML 或 HTML 序列化的序列化作为输入而不是 XML 或 HTML 序列化,并期望它输出 XML 或 HTML 序列化?

正确的做法是修复损坏的输入,但请参阅如何借助 XSLT 取消转义 XML 字符?


你这里有某种误解。XSL 将 XML 作为输入并输出 HTML 或 XML。<表示为&lt;序列化的 HTML 和 XML。

包含<不开始标记的 的 HTML 或 XML 文件是不正确的序列化(格式不正确)。

&lt;<是HTML 或 XML 文件中的正确表示。

HTML 或 XML 文件只是它所代表的数据的序列化。也就是说,它比它所代表的数据低一级。 您应该将 HTML 或 XML 的内容视为数据所代表的内容 ( <),而不是数据的序列化 ( &lt;)。

试着解释一下为什么你认为有&lt;问题,这样我们就可以纠正误解?

于 2011-07-13T13:36:59.590 回答