我需要执行以下映射。 我们收到一个(简单的)格式良好的XML文件。 在该xml文件中可以有特殊字符 - 这些字符是经过编码的。例如&
映射的输出必须如下所示:
<ns0:SupplierTransaction xmlns:ns0="http://MH.Schemas/SQL/MDM/Supplier">
<ns0:CIC.ImportSupplier_Spain>
<ns0:data><Suppliers xmlns=""><Supplier><IDCONO>All Freez &lt; &amp; &gt; (Verp)IZ Oude Bunders</IDCONO></Supplier></Suppliers></ns0:data>
</ns0:CIC.ImportSupplier_Spain>
</ns0:SupplierTransaction>
正如您所看到的,我需要对我收到的xml进行编码并将其包装在某些节点周围。 问题是对于特殊字符(&amp;,&lt;,&gt;),需要对它们进行两次编码。因为如果你将ns0:data字段解析回XML,那么它也会解析“&amp; amp;”回到“&amp;”导致XML无效。它应该解析为&amp; amp; amp; ==&GT;这就是它应该被编码两次的原因。
我的问题是,如何在xsl中完成此操作? 所以我需要检测特殊符号:
"&" and encode it twice: &amp;
"<" and encode it twice: &lt;
">" and encode it twice: &gt;
仅供参考,我正在将此消息传输到SQL过程。 SQL过程的输入参数称为“数据”,其数据类型为“XML”。因此,SQL将数据元素内部的所有内容解析为XML,如果我不对它们进行双重编码,则会在特殊字符处抛出错误。 例如:
<ns0:data><Node>This is some text & chars</Node></ns0:data>
所以这被解析如下:
<Node>This is some tekst & chars</Node> ==> Invalid XML
应该如下:
<ns0:data><Node>This is some text &amp; chars</Node></ns0:data>
解析如下:
<Node>This is some tekst & chars</Node> ==> Valid XML
答案 0 :(得分:1)
这对XSLT来说并不是一项工作,因为它将原始输入视为节点树,而不是文本字符串。您需要使用(非常复杂的)模板手动重新序列化输入文档。
如果您将原始XML作为字符串,那么最好不要尝试解析它并将其作为XML处理,而是使用您正在使用的任何语言编写XML的XML编写API。包含原始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();
但是等效行为应该很容易用任何语言实现。