0

我想知道 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 处理或不处理 Saxon-HE 处理 CDATA 部分的方式?

迈克尔

4

2 回答 2

1

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

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

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

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

但是,这并不能解决您的代码依赖于禁用输出转义的问题。如果您的 CDATA/text 节点包含需要复制到 HTML 页面中的 HTML 标记,那么在 Saxon-JS 下执行此操作的唯一方法是将 HTML 解析为节点树,并将节点添加到 HTML DOM。如果 HTML 是格式良好的 XML,您可以使用 parse-xml() 函数执行此操作;如果没有,您可能需要调用 Javascript。

于 2018-02-19T10:35:53.347 回答
1

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

Saxon-JS 没有实现规范的以下可选特性:模式感知、序列化、流式传输、高阶函数和禁用输出转义

于 2018-02-18T20:08:11.480 回答