xsl试图输出'<'而不是'&lt;'

dud*_*dok 6 xslt invalid-characters xslt-1.0

更新:

这个问题仍然存在,尽管它与以前不完全相同.下面是输入内容,输出内容和输出内容的示例

输入的一个例子:

&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;
Run Code Online (Sandbox Code Playgroud)

当前输出:

&lt;p&gt;&lt;span style="font-size: medium"&gt;Product description text&lt;/span&gt;&lt;/p&gt;
Run Code Online (Sandbox Code Playgroud)

预期产量:

<p><span style="font-size: medium">Product description text</span></p>
Run Code Online (Sandbox Code Playgroud)

.

使用CDATA有帮助,因为它允许我输入'<'但是如上面的输出所示,即使使用disable-output-escaping,它在输出中也发生了变化

.

.

原始问题:

我得到的错误是"'<',十六进制值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)"/>
Run Code Online (Sandbox Code Playgroud)

我尝试过各种各样的东西代替文本,例如价值等.

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

这个问题虽然是我希望<和>字面上输出,而不是浏览器随后看到并改变的代码

.

如果您需要更多信息,请问(我很难解释这个问题)

任何帮助将不胜感激

Emi*_*ggi 10

<xsl:text disable-output-escaping="yes"><![CDATA[<]]></xsl:text>
Run Code Online (Sandbox Code Playgroud)

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

<xsl:text disable-output-escaping="yes">></xsl:text>
Run Code Online (Sandbox Code Playgroud)

  • "CDATA"并不是必需的.只需使用`<xsl:text disable-output-escaping ="yes">&lt; </ xsl:text>`. (3认同)

jas*_*sso 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;
Run Code Online (Sandbox Code Playgroud)

预期输出:

<p><span style="font-size: medium">Product description text</span></p>
Run Code Online (Sandbox Code Playgroud)

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

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

<xsl:variable name="lt">
  <xsl:text><![CDATA[<]]></xsl:text>
</xsl:variable>
Run Code Online (Sandbox Code Playgroud)

或者

<xsl:variable name="lt">
  <xsl:text>&lt;</xsl:text>
</xsl:variable>
Run Code Online (Sandbox Code Playgroud)

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

<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>
Run Code Online (Sandbox Code Playgroud)

这些代码示例不起作用,因为disable-output-escaping="yes"仅在值被序列化时才有效,而在变量被分配时无效。

一个可能的修复

您可以尝试做的是将文本替换的结果存储到变量中

<xsl:variable name="replaced-text">
    <xsl:copy-of select="ew:replacestring(products_description/node(),$lthex,$lt)"/>
</xsl:variable>
Run Code Online (Sandbox Code Playgroud)

然后输出这个变量的值 disable-output-escaping="yes"

<xsl:value-of select="$replaced-text" disable-output-escaping="yes"/>
Run Code Online (Sandbox Code Playgroud)

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

我能够转换你的输入

&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;
Run Code Online (Sandbox Code Playgroud)

到这个输出

<p><span style="font-size: medium">Product description text</span></p>
Run Code Online (Sandbox Code Playgroud)

使用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>
Run Code Online (Sandbox Code Playgroud)

所需的修改是更改代码示例的这一部分

<acronym title="{$acronyms[1]}">
    <xsl:value-of select="$acronym" />
</acronym>
Run Code Online (Sandbox Code Playgroud)

看起来像这样

<xsl:value-of select="$acronyms[1]" disable-output-escaping="yes"/>
Run Code Online (Sandbox Code Playgroud)

该模板应该适用于所有环境,因为它是 XSLT 1.0 并且不需要任何扩展功能。