为什么在获取带有表情符号的cdata元素时,我会在xml标记中获取多个cdata



我已经在谷歌上搜索了几个小时(几天(,但没有找到为什么我会有这个问题,让我向你解释一下。

摘要

我想转换一个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 - &#128176; - 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 - &#128176; - 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/