xsl尝试输出'<'而不是'<'

时间:2011-07-12 11:32:35

标签: xslt xslt-1.0 invalid-characters

更新

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

的示例

输入的一个例子:

<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有帮助,因为它允许我输入'&lt;'但正如上面的输出所示,即使使用disable-output-escaping,它在输出中也发生了变化

原始问题:

我得到的错误是“'&lt;',十六进制值0x3C,是无效的属性字符”

我要做的是替换所有出现的&amp; lt;和&amp; gt;与&lt;和&gt;分别

为了保持尽可能简单,这里只是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)"/>

我尝试过各种代替文字的东西,例如价值等等。

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

这个问题虽然是我想要&lt;和&gt;字面上是输出,而不是浏览器看到并更改的代码

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

任何帮助将不胜感激

3 个答案:

答案 0 :(得分:10)

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

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

<xsl:text disable-output-escaping="yes">></xsl:text>

答案 1 :(得分:4)

原始问题

  

输入的一个例子:

&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's acronym replacement template。在您的情况下,包含首字母缩略词标题的文档将如下所示

<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,并且不需要任何扩展功能。

答案 2 :(得分:0)

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

正确的做法是修复损坏的输入,但请参阅How to unescape XML characters with help of XSLT?


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

包含不启动标记的<的HTML或XML文件是错误的序列化(格式不正确)。

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

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

请尝试解释为什么您认为&lt;存在问题,以便我们纠正错误?