0

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

概括

我想转换一个 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>

爪哇:

此实现是可用的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似乎有同样的问题。

如果您需要更多数据,请告诉我 ;-)

4

1 回答 1

0

rt.jar我猜你得到了一个非常旧的 1.0 处理器。它的序列化器被不在 BMP 中的字符弄糊涂了?

我做了一个快速的实验,Saxon HE 做了你想做的事。

您可以从 Saxon HE 运行 Java 函数,但您必须更加努力地配置它们。如果您没有太多,并且您不需要调用任意 Java 函数的能力,那么这可能是一种前进的方式。

您可以在例如https://github.com/docbook/xslTNG/中找到配置 Saxon HE 以运行 Java 扩展功能的示例

于 2021-05-11T19:10:33.210 回答