【问题标题】:Why xsl:result-document fails inside <xsl:attribute> instruction?为什么 xsl:result-document 在 <xsl:attribute> 指令中失败?
【发布时间】:2011-11-24 10:07:25
【问题描述】:

我正在使用 Saxon-EE 9.3.0.4 进行 xsl 转换,发现当在 &lt;xsl:attribute&gt;(以及 &lt;xsl:namespace&gt;&lt;xsl:processing-instruction&gt;)指令中使用 &lt;xsl:result-document&gt; 时,处理器 引发 XTDE1480 错误 - 在写入临时树时无法切换到最终结果目的地

<xsl:attribute name="a">
    <xsl:result-document href="result.xml" > - error here
        test
    </xsl:result-document>
</xsl:attribute>

根据specification(附录 D),&lt;xsl:result-document&gt; 的允许父母是:

  • 任何内容模型为序列构造函数的 XSLT 元素
  • 任何文字结果元素

这是 Saxon 中的错误还是规范中未定义的 &lt;xsl:result-document&gt; 使用限制?

更新: 我认为在&lt;xsl:attribute&gt; 中使用&lt;xsl:result-document&gt; 并不是一个好主意,但是为什么会发生错误呢?

谢谢

【问题讨论】:

  • @Vincent Biragnet 提供了很好的解释。除此之外,使用&lt;xsl:result-document&gt; 来生成属性值是没有意义的。根据规范,&lt;xsl:attribute&gt; 的内容必须是序列构造函数。另一方面,&lt;xsl:result-document&gt; 不是序列构造函数。因此,不管错误消息如何,将&lt;xsl:result-document&gt; 放入&lt;xsl:attribute&gt; 是错误的。 xsl:result-document 生成最终结果树。根据规范:[定义:最终结果树构成最终输出的一部分。一旦创建就无法在样式表中访问。]

标签: xslt xslt-2.0 saxon


【解决方案1】:

在规范中,您可以阅读:

初始模板中的指令在最终输出中进行评估 状态。一条指令在与其相同的输出状态下被评估 调用指令,除了 xsl:variable, xsl:param, xsl:with-param, xsl:attribute, xsl:comment, xsl:处理指令,xsl:命名空间,xsl:值,xsl:函数, xsl:key、xsl:sort 和 xsl:message 总是评估 它们包含的序列构造函数处于临时输出状态。

xsl:result-document 写入最终树结果,鉴于上述规则,我理解在以下元素中尝试写入最终树结果是错误的

xsl:variable, xsl:param, xsl:with-param, xsl:attribute, xsl:comment, xsl:processing-instruction, xsl:namespace, xsl:value-of, xsl:function, xsl:key, xsl :sort 和 xsl:message

【讨论】:

  • 是的,result-document 不是序列构造函数(与所有其他指令一样),但可以在任何指令内部,其内容是序列构造函数。 [定义:序列构造函数是样式表中零个或多个兄弟节点的序列,可以对其进行评估以返回一系列节点和原子值。结果序列的使用方式取决于包含指令。]
  • 对,我没抓住重点,在你发表评论后我重写了我的答案。
  • 为了明确该行为不是撒克逊人特有的,我尝试了一个带有 XQSharp 和 AltovaXML 的示例,并且都给出了类似的错误消息(“XTDE1480:无法使用 URI 'result.xml' 创建结果文档时处于临时输出状态。", "XTDE1480: Unexpected [xsl:]result-document 指令在 xsl:result-document 的临时输出状态中使用")。
  • @Martin Honnen - 是的,它完全符合规范
【解决方案2】:

2018 年更新:请注意,XSLT 3.0 规范放宽了限制。 xsl:attributexsl:comment 等指令不再设置临时输出状态。最近的 Saxon 版本(肯定是 9.8)实施了修订后的规则。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    • 2014-03-10
    • 2013-08-20
    • 2016-06-08
    相关资源
    最近更新 更多