【问题标题】:Saxon EE 10.3 XSLT Error: Cannot create an attribute node (id) whose parent is a document nodeSaxon EE 10.3 XSLT 错误:无法创建其父节点是文档节点的属性节点 (id)
【发布时间】:2021-01-26 13:36:28
【问题描述】:

我有这个源 xml:

 <cip>
   <data>
      <typo>
         <articles>
            <article id="BM017106--">
               <lang>Lang Text(de-AT) -- BM017106--:6</lang>
            </article>
            <article id="XC01010101">
               <lang>H07V-U (Ye) 1,5mm² schwarz, PVC Aderleitung eindrähtig</lang>
            </article>
         </articles>
      </typo>
   </data>
</cip>

并遵循 xslt:

 <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

   <xsl:template match="/">
      <xsl:message select="cip/data/typo/articles/article[1]/@id"/>
   </xsl:template>

</xsl:stylesheet>

当我使用 Saxon saxon9ee.jar 对其进行转换时,一切正常。 当我尝试使用 saxon-ee-10.3.jar 对其进行转换时,我得到:错误 XTDE0420,无法创建其父节点是文档节点的属性节点 (id)。 有人知道出了什么问题吗?

【问题讨论】:

  • 当一切都“很好”时,您使用 Saxon 9 究竟会得到什么结果?只是带有属性名称和/或值的消息?也许对于 Saxon 10,作为一种解决方法,输出例如cip/data/typo/articles/article[1]/@id!(local-name() || '=' || .).
  • 有一个非常古老的错误报告 saxonica.plan.io/issues/950 说 Saxon 9 试图通过不引发该错误来实现用户友好,但不确定 10.3 中发生了什么变化。
  • 使用 Saxon 9 我得到:
  • 测试用例github.com/w3c/xslt30-test/blob/master/tests/insn/message/…似乎检查了这一点,不知道为什么在Saxon发布测试中没有出现问题,似乎10.0具有通过输出属性节点作为处理指令而恢复的行为,而10.1 是第一个提高 XTDE0420 的 Saxon 版本。

标签: xml xslt xpath saxon


【解决方案1】:

XSLT 3.0 规范说(在 §23.1 中):

如果 xsl:message 指令包含序列构造函数,则 使用通过评估此序列构造函数获得的序列 构造新文档节点的内容,如中所述 5.7.1 构建复杂的内容。

并且 5.7.1 说尝试将属性节点附加到文档节点是错误的。

§23.1 继续说:

评估选择表达式时发生的任何动态错误 或包含的序列构造函数,以及任何序列化错误 在处理结果时发生,不会导致 转型失败;在最坏的情况下,这意味着没有消息输出, 或者输出的唯一消息是与 发生的错误。

这就是 Saxon 所做的:它将错误消息作为 xsl:message 指令的内容输出,然后转换继续进行。

紧随其后的注释描述了这种情况,xsl:message 尝试输出属性节点。但是注释中的说明是错误的.

因此,Saxon 的行为方式与规范一致,尽管可以说可以做得更好,例如使用自适应序列化方法序列化传递给 xsl:message 的值。

我不确定为什么它在不同版本之间发生了变化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多