处理 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
中看到&
。转换 xml 时出错。
请帮我解决这个问题。
【问题讨论】:
这不是格式良好的 XML,您需要在源代码中修复未转义的&
,然后才能使用 XSLT 处理它。
@IanRoberts 这个 xml 是由一些工具生成的。例如,某些文件夹名称可能包含&
。那么如何将其替换为 '&'?
该工具需要修复以生成格式良好的 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("&","&");
根据 Flynn1179 的评论更新:
如果您害怕遇到问题,您的 XML 已经编码了一些字符。然后再添加一行:
string.Replace("&amp;","&");
更好的解决方案是修改生成此类 XML 文件的代码..
示例:使用 XML DOM 代替 String-concat
【讨论】:
你需要非常小心地这样做——如果文档包含一个很好的转义&amp;amp;
,你将错误地用&amp;amp;
替换它。您确实需要检查 &amp;
的每次出现是否还不是 XML 实体的一部分。
@Flynn1179,我也想到了同样的想法..但用户也有可能希望在输出中显示&amp;amp;
!!
所以真的不能确定用户在这里的要求是什么。如果他想摆脱这样的重复,那么他可以去string.Replace("&amp;amp;","&amp;");
是的,但这只是越来越混乱。我经常看到非常混乱的“解决方法”来修复预先存在的代码的错误输出,在这种情况下,最好在数据来自的任何地方更正输出。不要误会我的意思,在这种情况下这是一个很好的答案,只是没有必要做这样的事情。
@Flynn1179,同意你的看法..!我讨厌这种通过使用字符串连接来生成 XML 的代码,即使我遇到过这种情况!我选择了代码,因为它是一个更好的解决方案.. 如果 OP 真的无能为力,这个答案是为了提供额外的解决方案..【参考方案3】:
您需要escape them,就像在任何 XML 文档中一样。
&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 & Code\Common\ssc\src\Main.c"/>
<file line="1802" path="M:\PBA0039 & Code\Common\ssc\src\link1.c"/>
</duplication>
</pmd-cpd>
【讨论】:
如何用 '&' 转义 '&'。我不能手动完成,只需要使用 xsl 来实现。 @SachinMhetre - 你的意思是 XML 有&amp;
这样的?那不是&amp;
?如果是这样它不是有效的 XML。您需要有效的 XML 才能使用 XSL。
这个xml是由一些工具生成的。例如,某些文件夹名称可能包含&amp;
。那么如何将其替换为 '&'?
@SachinMhetre - 该工具正在生成无效的 XML。您需要修复该工具及其生成的无效 XML。 XSL不能用于此。
@SachinMhetre - 再一次。您没有 XML。该文件是不是有效的 XML。它没有很好地形成。 XSL 只能处理格式良好的 XML 文件。问题是 &amp;
本身在 XML 文件中无效。以上是关于处理 xsl 中的特殊字符的主要内容,如果未能解决你的问题,请参考以下文章