我想知道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部分的方式或不处理CDATA部分的方式?
迈克尔
答案 0 :(得分:1)
答案 1 :(得分:1)
是的,有一个已知问题:https://saxonica.plan.io/issues/3385
如果没有看到更多代码,我不确定该问题是否相关。该bug表示如果有任何空白剥离有效,CDATA部分将转换为文本节点,但不是这样,所以一个有用的实验将是看看如果添加到样式表会发生什么
<xsl:strip-space elements="a-dummy-element-name"/>
这将触发空白剥离,这也会将CDATA节点转换为普通文本节点。
但是,这并不能解决您的代码依赖于disable-output-escaping的问题。如果您的CDATA /文本节点包含需要复制到HTML页面的HTML标记,则在Saxon-JS下执行此操作的唯一方法是将HTML解析为节点树,并将节点添加到HTML DOM。如果HTML是格式良好的XML,则可以使用parse-xml()函数执行此操作;如果没有,您可能需要调用Javascript。