为啥我在使用表情符号获取 cdata 元素时在 xml 标记中获取多个 cdata

Posted

技术标签:

【中文标题】为啥我在使用表情符号获取 cdata 元素时在 xml 标记中获取多个 cdata【英文标题】:Why am I getting multiple cdata in xml tag when get cdata element with emoji为什么我在使用表情符号获取 cdata 元素时在 xml 标记中获取多个 cdata 【发布时间】:2021-08-02 02:05:41 【问题描述】:

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

总结

我想转换一个 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 似乎有同样的问题。

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

【问题讨论】:

在这里查看:***.com/questions/42017856/… Saxon HE 是否至少为您的测试用例提供了您想要的结果?另外,虽然 HE 不允许自反扩展,但我认为 (saxonica.com/html/documentation10/extensibility/…) 我认为 Xalan 上也存在与星光 Unicode 字符相关的各种错误,其中一些带有补丁。因此,也许构建您自己的更新或检查其他人是否已完成并重用将对此进行排序。我有点确定我们不久前在这里遇到了一个问题,有人指出与 Unicode 问题相关的预发布/修补版本,但我恐怕现在无法通过搜索找到它。 @MartinHonnen 是的,我想我已经读过一些关于此的内容。补丁和拉取请求是在 xalan 存储库中提出的,并且在相应的问题中可用,但该项目已死......所以还没有人合并它。顺便说一句,我不是海关实施的粉丝,但是在一个死项目上,为什么不呢。除了 Xalan ans Saxon HE 之外,您还有其他需要推荐的库吗?非常感谢您抽出宝贵时间 :) 编辑:这是问题:issues.apache.org/jira/browse/XALANJ-2617 我不建议迁移到已有 10 年历史的 Saxon 9.1 Basic,但它仍然可以在 sourceforge.net/projects/saxon/files/Saxon-B/9.1.0.8 获得,并且应该在支持反射扩展功能的同时运行 XSLT 2。如果我没记错的话,这是 Saxon 的最后一个开源版本,在将软件重组为仍然支持反射扩展功能的商业 PE 和 EE 包和支持(仅)集成扩展功能的开源 HE 包之前,它是这样做的。 【参考方案1】:

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

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

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

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

【讨论】:

您好,谢谢您的回答,实际上我公司维护着数百个 xsl,我们无法为每个客户重新配置所有这些 xsl。这就是为什么我正在寻找与我们已有的东西“相似”的东西。但是,如果我们别无选择... ^^

以上是关于为啥我在使用表情符号获取 cdata 元素时在 xml 标记中获取多个 cdata的主要内容,如果未能解决你的问题,请参考以下文章

如何正确编码为啥使用节点请求模块的表情符号?

为啥不支持来自其他设备的表情符号?

苹果自拟表情为啥收到的是乱码

为啥 SQL Server 在 equals 语句中忽略表情符号?

为啥不和谐机器人适用于默认表情符号,而当我放置自定义表情符号时不起作用?

为啥我不能在这个 mysql 字段中存储 4 字节的表情符号?