我使用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>< left arrows</b>
是我想要实现的目标。对此有什么解决方案吗?
答案 0 :(得分:3)
XML应该包含小于号(&amp; lt;)的转义序列,而不是文字&lt;字符。 XML格式错误,任何XML解析器都必须拒绝它。
在XSLT中,您可以生成如下序列:
<xsl:text>&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;。基本上解决了我的问题。希望这对遇到与我相同问题的人有用。