使用表情符号获取 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/