【问题标题】:How can I throw an exception from XSLT?如何从 XSLT 中引发异常?
【发布时间】:2012-11-11 12:05:33
【问题描述】:

如果一个标签不包含属性,我想抛出一个异常。

【问题讨论】:

  • 显示代码,显示一些努力,而不仅仅是你想要的。
  • -1 并投票结束。这不是一个经过深思熟虑或建设性的问题,需要大量工作才能发现需要什么。连续投票者请停止
  • @Borodin,你为什么认为这不是一个建设性的问题?这个问题基于一个可靠的用例,在 XSLT 1.0、XSLT 2.0、XSLT 3.0 和 XPath 2.0 和 3.0 中有很好的解决方案。推翻您的反对意见可能是个好主意。
  • @LordTorgamus,OP 不知道如何提出异常,这就是他问这个问题的原因——你为什么希望这对欧普? Java 不是这个问题的唯一标签,XSLT 也是一个标签——因此,OP 询问如何从 XSLT 抛出异常——Petr Kozelka 准确地给了他 OP 需要的答案。再一次:考虑到所有这些,你为什么决定投票结束这个问题?这个问题定义明确且清晰——它非常有道理,而且答案对许多人来说都很有价值。请投票重新开放。请。重新打开

标签: java xml xslt


【解决方案1】:

使用xsl:message with terminate="yes"可以达到类似抛出异常的效果:

<xsl:if test="(your condition)">
   <xsl:message terminate="yes">ERROR: Missing attribute XYZ under
      <xsl:value-of select="local-name()"/> !</xsl:message>
</xsl:if>

这会导致消息被发送到 STDERR 并终止处理。

顺便说一句。这在Schematron 验证中大量使用。

【讨论】:

    【解决方案2】:

    除了使用&lt;xsl:message terminate="yes"/&gt;的正确答案:

    1. 在 XSLT 3.0 中,可以使用新指令 &lt;xsl:try ...&gt;&lt;xsl:catch ...&gt;http://www.w3.org/TR/xslt-30/#try-catch

    2. 在 XSLT 2.0 中,还可以使用标准的 XPath 函数 error() 来终止处理。

    这里是一个使用xsl:tryxsl:catch的例子

    <xsl:result-document href="out.xml">
      <xsl:variable name="result">
        <xsl:call-template name="construct-output"/>
      </xsl:variable>
      <xsl:try>
        <xsl:copy-of select="$result" validation="strict"/>
        <xsl:catch>
          <xsl:message>Warning: validation of result document failed:
              Error code: <xsl:value-of select="$err:code"/>
              Reason: <xsl:value-of select="$err:description"/>
          </xsl:message>
          <xsl:sequence select="$result"/>
        </xsl:catch>
      </xsl:try>
    </xsl:result-document>
    

    【讨论】:

      【解决方案3】:

      XSLT 不是用来验证的!它用于转换..(XSLT 代表可扩展样式表语言转换)

      如果您想验证层次结构(这是您的要求)并验证数据.. 那就选择 XSD!可扩展架构定义..

      这里是learn XSD的链接参考

      必须通过主机代码(C#、Java 等)针对 XSD 验证 XML 验证返回一组结果。成功或失败并出现验证错误(如果存在)..

      【讨论】:

      • InfantProgrammer'Aravind,即使在 1.0 版中,XSLT 也已用于验证。 Schematron 基于 XSLT。在 XSLT 2.0 中有广泛的 XSD 验证功能,任何 XSLT 2.0 SA(模式感知)XSLT 处理器都实现了这些功能。
      • @DimitreNovaatchev,是的 :) 我有点忘记了 .. 现在我想起来了 :) 谢谢..
      • “XSLT 不是用来验证的!它是用来转换的”,然后你会得到一条评论,清楚地表明它可以用于验证并且已经被用于验证!所以你的答案部分错误。
      • @Petoj,当然,你的说法不正确——阅读 xsl-list(最近的主题)和 Michael Kay 的书,你就会明白。
      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 2012-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-01
      相关资源
      最近更新 更多