【问题标题】:Throwing an exception from XSLT从 XSLT 引发异常
【发布时间】:2014-09-04 02:19:26
【问题描述】:

当外部文档不可用时,我需要 XSLT 停止处理并出现错误。根据我的发现, 标记似乎是正确的方法,但到目前为止它不起作用。这是我尝试过的:

<xsl:if test="not(document('some_external_doc.xml')//myxpath)">
    <xsl:message terminate="yes">ERROR: Missing element!</xsl:message>
    <h1>Error detected!</h1>
</xsl:if>

检测到缺少的文档/xpath,并且将显示

,但由于某种原因, 的终止属性被忽略。转换是在 Railo 中完成的,因此 XSLT 处理器的使用应该是 Java 默认值,但我无法找到关于 Railo 正在使用的处理器的确切信息。

【问题讨论】:

  • 为什么不在转换前检查架构?创建 XSD 是有原因的。
  • 您可以使用 XML 中的 system-property 函数来获取属性 xsl:versionxsl:vendorxsl:vendor-url- 这将准确地告诉您您正在使用什么 XSLT 处理器。

标签: xml xslt railo


【解决方案1】:

不过,你的想法是对的……

如果您的 XSLT 处理器实现了 XSLT 1.0,它在技术上不必终止。注意在spec for xsl:message:

中使用了should这个词而不是must

如果 terminate 属性的值为 yes,则 XSLT 处理器 发送消息后应该终止处理。默认 值为否。

有趣的是,XSLT 2.0changes应该必须

如果终止属性的有效值为yes,则 处理器必须在发送消息后终止处理。

还要注意xsl:message 语句的执行顺序取决于处理器;在日志中查找xsl:message 输出时请记住这一点。

最后,您在 XSLT 2.0error() 函数)和 XSLT 3.0xsl:try and xsl:catch)下还有一些额外的异常处理选项。

【讨论】:

  • 说实话,我认为 1.0 和 2.0 之间的措辞变化更多是为了澄清,而不是改变意思。我认为 1.0 的定义意味着如果处理器不终止,它将违反规范。
猜你喜欢
  • 2012-11-11
  • 1970-01-01
  • 2018-05-01
  • 2014-10-25
  • 1970-01-01
  • 2014-10-07
  • 1970-01-01
  • 2019-09-06
  • 1970-01-01
相关资源
最近更新 更多