在 XSLT 中的字符串中转义“&”

Posted

技术标签:

【中文标题】在 XSLT 中的字符串中转义“&”【英文标题】:Escape "&" within a string in 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,如果您不妨碍它的话。 【参考方案1】:

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

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

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

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

另见:

What characters do I need to escape in XML documents? How to parse invalid (bad / not well-formed) XML? Is there any difference between 'valid xml' and 'well formed 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);

【讨论】:

以上是关于在 XSLT 中的字符串中转义“&”的主要内容,如果未能解决你的问题,请参考以下文章

你如何在 Freemarker 中转义正则表达式字符串

在 SQL 字符串中转义 & 字符

我需要在 XML 文档中转义哪些字符?

不需要在 javascript 中转义 innerHTML 字符?

在 App.config 中转义 &

在字符串中转义反斜杠 - javascript