XSLT。加载包含转义字符的xml文档

时间:2009-07-23 10:14:31

标签: asp.net xml xslt

我使用XSLT转换XML文档,然后将其加载到ASP.NET网站。但是,如果XML包含“<”字符,则XML会变得格式不正确。

<title><b> < left arrows <b></title>

如果我使用disable-output-escaping="yes",则无法加载XML,我收到错误“名称不能以''字符开头”。

如果我没有禁用输出转义,则会忽略转义字符,并且文本显示为:

<title><b> < left arrows <b></title>

我希望粗体标签可以工作,但我也想逃避'&lt;'字符。理想地

<b>&lt; left arrows</b>

是我想要实现的目标。对此有什么解决方案吗?

3 个答案:

答案 0 :(得分:3)

XML应该包含小于号(&amp; lt;)的转义序列,而不是文字&lt;字符。 XML格式错误,任何XML解析器都必须拒绝它。

在XSLT中,您可以生成如下序列:

<xsl:text>&amp;lt;<xsl:text>

答案 1 :(得分:0)

根据我的理解,输入包含HTML和文字&lt;字符。在这种情况下,disable-output-escaping =“yes”将保留HTML标记,但会生成无效的XML并将其设置为no,否则将转义HTML标记。

您需要做的是保留set disable-output-escaping =“no”(这是默认设置,您实际上不必添加它)并添加将复制HTML标记的XSLT规则。例如:

<xsl:template match="*">
    <xsl:copy>
        <xsl:copy-of select="@*" />
        <xsl:apply-templates />
    </xsl:copy>
</xsl:template>

答案 2 :(得分:0)

我提出了一个解决方案,并由Josh的最后一个答案触发。谢谢乔希。我尝试使用匹配模板,但是我有一个问题,因为html标签放在cdata中,所以我很难做匹配。可能有办法做到这一点,但我放弃了。

我做的是做一个test =“contains($ text,$ replace)”,其中$ replace是'&lt;'字符,除此之外,我还添加了一个条件来测试'&lt;'之后的子字符串是一个相关的html标签,它实际上是&lt; b&gt;或&lt; / b&gt;。所以如果它只是一个'&lt;'不属于任何html标签的字符,我将转换'&lt;'至&amp;&amp; lt;。基本上解决了我的问题。希望这对遇到与我相同问题的人有用。