【问题标题】:Escaping & and CDATA with XSLT使用 XSLT 转义 & 和 CDATA
【发布时间】:2013-10-17 12:56:22
【问题描述】:

给定以下 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;amp;#8962; 转换为正确的表示形式:⌂?

【问题讨论】:

  • 由于 CDATA 部分作为转义机制存在,因此内部的标记应为 &lt;p&gt;Look at this beautiful house: &amp;#8962;&lt;/p&gt;。目前数据使用两种转义机制,并且禁用输出转义不会同时解决它们。
  • 我理解这个问题,但不知道通过 XSL-T 解决它的好方法。
  • 您需要处理文本并将序列&amp;amp;#8962; 转换为相应的字符。使用 XSLT 2.0 和分析字符串或替换很容易,使用 XSLT 1.0 更加努力。如果无法更改输入格式,您只能这样做。
  • xslt 2 还是 1?在前者中,您可以只使用 replace(.,'amp;','') 而不是 .(但实际上您应该修复任何软件或用户正在生成损坏的输入。)

标签: xml xslt


【解决方案1】:

我最终修复了它:

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

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

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

很遗憾,无法从源头上修复损坏的输入,这是我们工作领域的常见问题。 :)

【讨论】:

    【解决方案2】:

    对于像我一样碰巧遇到这种情况的任何人,以下是我在我的 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"/>
    

    【讨论】:

      猜你喜欢
      • 2016-08-22
      • 1970-01-01
      • 1970-01-01
      • 2012-11-23
      • 2013-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-02
      相关资源
      最近更新 更多