问题描述
我已经在谷歌上搜索了几个小时(几天),但没有找到我为什么会遇到这个问题,让我向你解释一下。
总结
我想转换一个xml,更具体地说,获取一个标签值,它是一个带有表情符号的cdata。但是,在转换之后,我得到了这个 <cdata-given-xml-value><![CDATA[A - ]]>?<![CDATA[ - B]]></cdata-given-xml-value>
而不是这个 <cdata-given-xml-value>A - ? - B</cdata-given-xml-value>
之后的所有细节:
输入xml:
<?xml version="1.0" encoding="utf-8"?>
<d>
<t><![CDATA[A - ? - B]]></t>
</d>
输入 xsl :
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output
method="xml"
encoding="utf-8"
indent="yes"
cdata-section-elements="cdata-given-xml-value"
/>
<xsl:template match="/">
<xsl:variable name="xml-value" select="/d/t/text()" />
<d>
<cdata-given-xml-value><xsl:copy-of select="$xml-value" /></cdata-given-xml-value>
<given-xml-value><xsl:value-of select="$xml-value" /></given-xml-value>
</d>
</xsl:template>
</xsl:stylesheet>
预期:
<?xml version="1.0" encoding="utf-8"?>
<d>
<cdata-given-xml-value><![CDATA[A - ? - B]]></cdata-given-xml-value>
<given-xml-value>A - 💰 - B</given-xml-value>
</d>
实际:
<?xml version="1.0" encoding="utf-8"?>
<d>
<cdata-given-xml-value><![CDATA[A - ]]>?<![CDATA[ - B]]></cdata-given-xml-value>
<given-xml-value>A - 💰 - B</given-xml-value>
</d>
Java:
此实现是 rt.jar
public void Xslt(Document document,File xsl,String encoding,Writer writer,String... args) throws TransformerException {
// Set system property here for tests purpose
System.setProperty("javax.xml.transform.TransformerFactory","com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl");
Transformer transformer = TransformerFactory.newInstance().newTransformer(new
StreamSource(xsl));
transformer.setoutputProperty(OutputKeys.INDENT,true);
transformer.setoutputProperty(OutputKeys.ENCODING,'UTF-8');
transformer.transform(new DOMSource(document),new StreamResult(writer));
}
我也尝试过 saxon-he
,但它不允许使用集成的扩展函数(调用 java 方法),我需要这个功能。
xalan-2.7.2.jar
似乎有同样的问题。
如果您需要更多数据,请告诉我;-)
解决方法
我猜您从 rt.jar
获得了一个非常旧的 1.0 处理器。它的序列化程序被 BMP 中没有的字符混淆了?
我做了一个快速实验,Saxon HE 可以满足您的需求。
您可以从 Saxon HE 运行 Java 函数,但您必须更加努力地配置它们。如果您没有太多,并且不需要调用任意 Java 函数的能力,那么这可能是一个前进的方向。
您可以找到配置 Saxon HE 以运行 Java 扩展功能的示例,例如,https://github.com/docbook/xslTNG/