【问题标题】:Escape "&" within a string in XSLT在 XSLT 中的字符串中转义“&”
【发布时间】:2021-01-20 21:40:45
【问题描述】:

我有一个包含特殊字符 (&) 的 XML。输出值是从数据库中获取的,需要保持原样。

以下是 XML 的示例

<Data>
   <fname>Patrick</fname>
   <lname>Lewis</lname>
   <resortloc>the pearl & shine</resortloc>
</Data>

这里的问题是&amp;。这是引发错误 -

解析 EntityName 时出错。

我还创建了一个 C# 函数,用于将 &amp; 字符替换为有效字符,请参见下文。但是当我运行代码时,我仍然得到错误。有人可以帮忙吗。谢谢

public static string EscapeXMLValue(string b)
{
   return b.Replace( "&","&amp;");
}

下面是我的 XSLT 代码

<xsl:value-of select= "cs:EscapeXMLValue(resortloc)" /> 

请帮忙。谢谢。

【问题讨论】:

  • 你需要用 "and" 替换这个 "&" 吗?但是你仍然在 Replace( "&","&") 中使用它,只需这样做 return b.Replace( "&" "和");
  • 你说你“有一个 XML”,但你没有。您有一个非 XML。 XSLT 只能处理格式良好的 XML。
  • 如果您试图在 XSL 中手动转义您的字符串值,您将做错事。默认情况下,XSL 将生成有效的正确转义的 XML,如果您不妨碍它的话。

标签: c# xml xslt


【解决方案1】:

我有一个包含特殊字符(“&”)的 XML。

不,您没有 XML。如果“XML”在不属于实体引用的文本节点中有 &amp;amp;,则它的格式不正确(因此不是 XML)。对于 & 字符本身,请使用 &amp;amp;

输出的值是从数据库中获取的,需要保持原样。

不管它来自哪里——它不是 XML,你不能使用 XML 工具或库来处理它。修复数据库导出,手动修复数据,或者在将数据传递给任何 XML 库或工具之前尝试自动将数据预处理作为文本

另见:

【讨论】:

    【解决方案2】:

    您将无法在带有 & 字符的标记上使用 XML 解析器。据我了解.net 的 XML 堆栈,使用 XSLT 中的自定义函数也不起作用,因为会发出错误在函数查看文本数据之前。如果您无法从源头修改输入,那么您可能会幸运地使用 SGML 解析器作为预处理器将您的输入转换为格式良好的 XML。具体来说,古老的 SP/OpenSP SGML 套件包含用于此目的的 osx 程序。虽然我不确定是否有最近的 Windows 版本。

    【讨论】:

      【解决方案3】:

      在 .NET 世界中,不是作为 Microsoft 的 .NET 框架库的一部分,而是在 NuGet 上,有 SgmlReader https://www.nuget.org/packages/Microsoft.Xml.SgmlReader/ 可以帮助解析此类输入并将其传递给大多数期望 XmlReader 的 .NET XML API像 XPathDocument、XmlDocument、XDocument 或 XslCompiledTransform。

      所以运行例如

              SgmlReader sgmlReader = new SgmlReader();
              sgmlReader.Href = Environment.CurrentDirectory + @"\your-not-well-formed-sample.xml";
      
              XPathDocument document = new XPathDocument(sgmlReader);
      
              Console.Out.WriteLine(document.CreateNavigator().OuterXml);
      

      给予

      <Data>
        <fname>Patrick</fname>
        <lname>Lewis</lname>
        <resortloc>the pearl &amp; shine</resortloc>
      </Data>
      

      意思是 SgmlReader 可用于将您的输入传递给 XSLT。

      所以处理输入的一种方法是在 XSLT 处理输入之前使用 SgmlReader 作为解析器。

      【讨论】:

        【解决方案4】:

        试试这个,MS Docs引用:

        public static string EscapeXMLValue(string tagText)
        {
           return SecurityElement.Escape(tagText);
        }
        

        【讨论】:

          猜你喜欢
          • 2011-03-25
          • 1970-01-01
          • 2013-02-21
          • 1970-01-01
          • 1970-01-01
          • 2015-01-21
          • 2012-09-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多