XSLT提取含emoji的XML CDATA内容时生成多段CDATA片段问题求助
根因说明
该问题是Xalan系列XSLT转换器(含JDK内置实现、Xalan 2.7.2独立包)的典型表现:包含Unicode增补字符(即码点超过U+FFFF的字符,本例中的💰对应码点U+1F4B0属于该范畴)的文本在DOM解析阶段会被拆分为多个相邻的Text节点,你使用<xsl:copy-of>会原封不动复制所有这些拆分后的Text节点,而cdata-section-elements配置会为每个子Text节点单独生成CDATA段,最终就出现了CDATA被断开的问题。
可行解决方案
方案1:修改XSLT写法(最推荐,改造成本极低)
将你XSLT中<cdata-given-xml-value>节点下的<xsl:copy-of select="$xml-value" />替换为<xsl:value-of select="$xml-value" />即可。<xsl:value-of>会自动把所有相邻Text节点的内容拼接为单个完整字符串输出,转换器会将整个字符串包裹在同一个CDATA段内,完全符合你的预期输出要求。
方案2:转换后做文本替换(兜底方案,无需改XSLT)
如果无法调整XSLT内容,可以在转换完成后对输出的XML字符串做正则替换,匹配模式]]>([^<]+)<!\[CDATA\[,将中间匹配到的内容和前后CDATA段合并即可。
方案3:更换转换器
如果你的业务可以接受付费工具,可以升级到Saxon-PE/EE版本,该系列转换器不存在CDATA拆分问题,同时支持Java扩展函数调用能力。
内容的提问来源于stack exchange,提问作者Patrick Ferreira
相关产品推荐
相关产品推荐

