在 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>
这里的问题是&
。这是引发错误 -
解析 EntityName 时出错。
我还创建了一个 C# 函数,用于将 &
字符替换为有效字符,请参见下文。但是当我运行代码时,我仍然得到错误。有人可以帮忙吗。谢谢
public static string EscapeXMLValue(string b)
return b.Replace( "&","&");
下面是我的 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;
,则它的格式不正确(因此不是 XML)。对于 & 字符本身,请使用 &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 & shine</resortloc>
</Data>
意思是 SgmlReader 可用于将您的输入传递给 XSLT。
所以处理输入的一种方法是在 XSLT 处理输入之前使用 SgmlReader 作为解析器。
【讨论】:
【参考方案4】:试试这个,MS Docs引用:
public static string EscapeXMLValue(string tagText)
return SecurityElement.Escape(tagText);
【讨论】:
以上是关于在 XSLT 中的字符串中转义“&”的主要内容,如果未能解决你的问题,请参考以下文章