Saxon-JS 是否存在处理包含元素的 CDATA 的已知错误

Is there a known error of Saxon-JS handling CDATA containing elements

我想知道 Saxon-JS 处理包含元素的 CDATA 的方式是否存在已知错误。

我有一个有效的 XSLT 3.0 和 XML 流程,其中包括从包含元素的 CDATA 中获取文本并在转换中应用 HTML 标记。我会尝试在不发布脚本的情况下提出问题。

我正在使用 Saxon-HE 9.8.0.3 并尝试使用最新的 Saxon-JS。 从 .xsl 文件转换为 .sef 文件的所有内容都有效,但从包含元素的 CDATA 中获取的文本的预期格式除外。

我有一个元素 <docText>,它只包含 <![CDATA[ ... ]]> 封闭的多行文本。

我用类似这样的方式调用模板: <xsl:apply-templates select="ancestor::document/docText"/>

我匹配<xsl:template match="docText/text()">

对变量中包含的 <docText> 中文本的最终操作输出如下: <xsl:value-of select="$step9-2" disable-output-escaping="yes" />

同样,当我在 Java 的命令行中使用带有 Saxon-HE、XML 和 XSLT 3.0 的原始转换时,工作 HTML 标记的输出是正确的。转换脚本与 Saxon-JS 的使用几乎相同,并且所有逻辑都有效,除了最初在 CDATA 部分中的文本格式。文本已输出但未格式化。

是否有任何原因可能是由于 Saxon-JS 处理 CDATA 部分的方式或不像 Saxon-HE 那样处理 CDATA 部分?

迈克尔

http://www.saxonica.com/saxon-js/documentation/index.html#!conformance/xslt30说法

Saxon-JS does not implement the following optional features of the specification: schema-awareness, serialization, streaming, higher-order functions, and disable-output-escaping

是的,存在一个已知问题:https://saxonica.plan.io/issues/3385

由于没有看到您的更多代码,我不确定该问题是否相关。该错误表明,如果有任何空白剥离有效,CDATA 部分将转换为文本节点,否则不会,因此一个有用的实验是看看如果添加到样式表会发生什么

<xsl:strip-space elements="a-dummy-element-name"/>

这将触发空白剥离,也具有将 CDATA 节点变成普通文本节点的效果。

但是,这不会解决您的代码依赖于 disable-output-escaping 的问题。如果您的 CDATA/text 节点包含需要复制到 HTML 页面的 HTML 标记,在 Saxon-JS 下执行此操作的唯一方法是解析 HTML进入节点树,并将节点添加到 HTML DOM。如果 HTML 是 well-formed XML 你可以使用 parse-xml() 函数来做到这一点;如果没有,您可能需要呼叫 Javascript.