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

Posted

技术标签:

【中文标题】XSL 编码特殊字符 XML 格式正确【英文标题】:XSL encoding special characters XML wellformed 【发布时间】:2013-06-06 08:19:29 【问题描述】:

我需要执行以下映射。 我们收到一个(简单的)格式良好的 XML 文件。 在该 xml 文件中可以有特殊字符 - 已编码。例如&

映射的输出需要如下所示:

<ns0:SupplierTransaction xmlns:ns0="http://MH.Schemas/SQL/MDM/Supplier">
  <ns0:CIC.ImportSupplier_Spain>
    <ns0:data>&lt;Suppliers xmlns=""&gt;&lt;Supplier&gt;&lt;IDCONO&gt;All Freez &amp;lt; &amp;amp; &amp;gt; (Verp)IZ Oude Bunders&lt;/IDCONO&gt;&lt;/Supplier&gt;&lt;/Suppliers&gt;</ns0:data>
   </ns0:CIC.ImportSupplier_Spain>
 </ns0:SupplierTransaction>

如您所见,我需要对收到的 xml 进行编码并将其包裹在一些节点上。 问题是对于特殊字符(&、),它们需要被编码两次。因为如果您将 ns0:data 字段解析回 XML,那么它也会解析“&”返回 "&" 导致无效的 XML。它应该将其解析为 & ==> 所以这就是为什么它应该被编码两次。

我的问题是,我怎样才能在 xsl 中做到这一点? 所以我需要检测特殊符号:

"&" and encode it twice: &amp;amp;
"<" and encode it twice: &amp;lt;
">" and encode it twice: &amp;gt;

仅供参考,我正在将此消息传输到 SQL 过程。 SQL 过程的输入参数称为“数据”,数据类型为“XML”。因此,SQL 将数据元素内的所有内容解析为 XML,如果我不对特殊字符进行双重编码,它会在特殊字符处引发错误。 例如:

<ns0:data>&lt;Node&gt;This is some text &amp; chars&lt;/Node&gt;</ns0:data>

所以解析如下:

<Node>This is some tekst & chars</Node> ==> Invalid XML

应该是这样的:

<ns0:data>&lt;Node&gt;This is some text &amp;amp; chars&lt;/Node&gt;</ns0:data>

解析如下:

<Node>This is some tekst &amp; chars</Node> ==> Valid XML

【问题讨论】:

【参考方案1】:

这并不是 XSLT 的真正工作,因为它将原始输入视为节点树,而不是文本字符串。您需要使用(极其复杂的)模板手动重新序列化输入文档。

如果您将原始 XML 作为字符串,那么您最好不要尝试将其解析并作为 XML 处理,而是使用您正在使用的任何语言的 XML 编写 API 来编写 XML包含原始 XML 数据字符串作为 ns0:data 元素的字符内容的文档,并让 XML 序列化程序处理所有必要的转义。 Java 示例可能是

XMLOutputFactory xof = XMLOutputFactory.newFactory();
XMLStreamWriter writer = xof.createXMLStreamWriter(outputStream, "UTF-8");
writer.writeStartDocument();
String uri = "http://MH.Schemas/SQL/MDM/Supplier";
writer.writeStartElement("ns0", "SupplierTransaction", uri);
writer.writeStartElement("ns0", "CIC.ImportSupplier_Spain", uri);
writer.writeStartElement("ns0", "data", uri);
writer.writeCharacters(originalXMLString);
writer.writeEndDocument();
writer.close();
outputStream.close();

但等效的行为应该很容易用任何语言实现。

【讨论】:

您好,感谢您的反馈。但是,如果我想将“ns0:data”节点中的部分转换回 XML,xml 是否仍然有效?例如,假设我有以下字符串:<Node>This is &文本</> ==> 这不会导致 This is & tekst 现在是无效的 XML,因为 & 没有转义? 我将在节点周围添加一个 CDATA 部分,这样特殊字符就不会出现了 :) 愚蠢的我之前没有想到这一点 :) 无论如何感谢帮助 @Rise_against 如果原始字符串是&amp;lt;Node&amp;gt;text &amp;amp;amp; more&amp;lt;/Node&amp;gt;,那么当您将其作为字符数据包含在我的示例中时,它将根据您的需要被序列化为&amp;lt;Node&amp;gt;text &amp;amp;amp; more&amp;lt;/Node&amp;gt;

以上是关于XSL 编码特殊字符 XML 格式正确的主要内容,如果未能解决你的问题,请参考以下文章

XSL 中的特殊字符

无法以正确的格式、gmail api 和 ae.net.mail 对特殊字符电子邮件进行编码

XMl特殊字符转换参考

Rss提供视图,显示标题中编码的特殊字符

JSON 到 XML:如何避免特殊字符编码 # 到 _x0023_?

c#中 如何解决xml格式的字符串中特殊字符