逃避&和CDATA与XSLT

时间:2013-10-17 12:56:23

标签: xml xslt

给出以下XML:

<element><![CDATA[<p>Look at this beautiful house: &amp;#8962;</p>]]></element>

这个XSL-T:

<xsl:template match='/element'>
    <xsl:value-of select="." disable-output-escaping="yes" />
</xsl:template>

将其转换为:

<p>Look at this beautiful house: &amp;#8962;</p>

所以CDATA被删除了,但我如何将&amp;#8962;转换为正确的表示:⌂?

2 个答案:

答案 0 :(得分:1)

我最终用以下方法修复它:

<xsl:value-of select="replace(current(), '&amp;amp;', '&amp;')" disable-output-escaping="yes"/>

我不得不在这里转义&符号因为我直接在XML中使用它,所以处理器将它转换回replace(current(), '&amp;', '&')这就是我想要的。

我正在使用XSLT v2,因为它具有替换功能。

不幸的是,在源头修复损坏的输入是不可能的,这是我们工作领域的一个常见问题。 :)

答案 1 :(得分:0)

对于像我一样偶然发现此问题的任何人,这是我如何在ASP.Net MVC网站上针对XSLT 1.0样式表解决此难题的方法。可以满足我的需求。希望它能对您有所帮助。

首先,我编写了此函数并将其包含在样式表中:

<msxsl:script language="C#" implements-prefix="functions">
    <msxsl:assembly name="System.Web"/>
    <msxsl:using namespace="System.Web"/>
    <![CDATA[       
          public string RemoveAmpersandEncoding(string sText)
          {
            return sText.Replace("&amp;", "&");
          }
    ]]>
</msxsl:script>

然后我稍后在样式表中调用该函数以获取必要的结果:

<xsl:value-of select="functions:RemoveAmpersandEncoding(/ReservationsViewData/Campground/CancellationPolicy)" disable-output-escaping="yes"/>