处理 xsl 中的特殊字符

Posted

技术标签:

【中文标题】处理 xsl 中的特殊字符【英文标题】:Handling special characters in xsl 【发布时间】:2012-11-14 23:24:03 【问题描述】:

我有一个 xml,其中包含一些特殊字符,例如 &whitespaces。 我想在 xsl 中处理这些特殊字符。 如何?

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="cpdhtml.xsl"?>
<pmd-cpd>
    <duplication lines="72" tokens="75">
        <file line="632" path="M:\PBA0039 & Code\Common\ssc\src\Main.c"/>
        <file line="1802" path="M:\PBA0039 & Code\Common\ssc\src\link1.c"/>
    </duplication>
</pmd-cpd>

在这里您可以在path 中看到&amp;。转换 xml 时出错。 请帮我解决这个问题。

【问题讨论】:

这不是格式良好的 XML,您需要在源代码中修复未转义的 &amp;,然后才能使用 XSLT 处理它。 @IanRoberts 这个 xml 是由一些工具生成的。例如,某些文件夹名称可能包含&amp;。那么如何将其替换为 '&'? 该工具需要修复以生成格式良好的 XML。 XSL 无法对格式不正确的 XML 文件进行操作。 好的...谢谢你的信息。 在 XSLT 2.0 中,您可以将其作为常规文本(不是 xml)文件读取,并将所有出现的“&”替换为“&”。这会转义“&”字符并生成格式良好的 XML 文档的文本表示。然后您可以使用您的 XSLT 代码处理此 XML 文档。 【参考方案1】:

如果 XML 文件无效,则不能使用 XSLT 转换它。要在您的 xml 中保留 excaping 字符,您可以在 XML 中使用 CDATA 部分。然后,您可以安全地使用 XSLT 来选择那些 CDATA。 查看以下关于如何使用 CDATA 来保持转义字符的帖子。

http://vvratha.blogspot.com/2012/11/extracting-cdata-section-using-xslt.html

【讨论】:

【参考方案2】:

我猜这些 XML 文件是由字符串连接生成的……否则你不可能得到未编码的 XML。

摆脱特殊字符的唯一方法是使用任何编程语言,如 C#、VB.NET 并将文件加载为字符串。 使用字符串操作操作..

string.Replace("&","&amp;");

根据 Flynn1179 的评论更新:

如果您害怕遇到问题,您的 XML 已经编码了一些字符。然后再添加一行:

string.Replace("&amp;amp;","&amp;");

更好的解决方案是修改生成此类 XML 文件的代码..

示例:使用 XML DOM 代替 String-concat

【讨论】:

你需要非常小心地这样做——如果文档包含一个很好的转义&amp;amp;amp;,你将错误地用&amp;amp;amp;替换它。您确实需要检查 &amp;amp; 的每次出现是否还不是 XML 实体的一部分。 @Flynn1179,我也想到了同样的想法..但用户也有可能希望在输出中显示&amp;amp;amp;!! 所以真的不能确定用户在这里的要求是什么。如果他想摆脱这样的重复,那么他可以去string.Replace("&amp;amp;amp;","&amp;amp;"); 是的,但这只是越来越混乱。我经常看到非常混乱的“解决方法”来修复预先存在的代码的错误输出,在这种情况下,最好在数据来自的任何地方更正输出。不要误会我的意思,在这种情况下这是一个很好的答案,只是没有必要做这样的事情。 @Flynn1179,同意你的看法..!我讨厌这种通过使用字符串连接来生成 XML 的代码,即使我遇到过这种情况!我选择了代码,因为它是一个更好的解决方案.. 如果 OP 真的无能为力,这个答案是为了提供额外的解决方案..【参考方案3】:

您需要escape them,就像在任何 XML 文档中一样。

&amp;amp; 的转义符是 &amp;amp;

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="cpdhtml.xsl"?>
<pmd-cpd>
    <duplication lines="72" tokens="75">
        <file line="632" path="M:\PBA0039 &amp; Code\Common\ssc\src\Main.c"/>
        <file line="1802" path="M:\PBA0039 &amp; Code\Common\ssc\src\link1.c"/>
    </duplication>
</pmd-cpd>

【讨论】:

如何用 '&' 转义 '&'。我不能手动完成,只需要使用 xsl 来实现。 @SachinMhetre - 你的意思是 XML 有 &amp;amp; 这样的?那不是&amp;amp;?如果是这样它不是有效的 XML。您需要有效的 XML 才能使用 XSL。 这个xml是由一些工具生成的。例如,某些文件夹名称可能包含&amp;amp;。那么如何将其替换为 '&'? @SachinMhetre - 该工具正在生成无效的 XML。您需要修复该工具及其生成的无效 XML。 XSL不能用于此。 @SachinMhetre - 再一次。您没有 XML。该文件是不是有效的 XML。它没有很好地形成。 XSL 只能处理格式良好的 XML 文件。问题是 &amp;amp; 本身在 XML 文件中无效。

以上是关于处理 xsl 中的特殊字符的主要内容,如果未能解决你的问题,请参考以下文章

XSL 编码特殊字符 XML 格式正确

shell脚本中怎样对特殊字符进行处理 一串密码在加密前对密码中的!@#$%等特殊字符进行处理(加上‘’)。

如何处理JSON中的特殊字符

Oracle中特殊字符&和'的处理方案

iOS Json解析中特殊字符串('\\')处理

URL中的特殊字符处理