29

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

4

3 回答 3

33

使用xsl:messagewithterminate="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验证中被大量使用。

于 2012-11-23T07:38:16.517 回答
24

除了使用的正确答案<xsl:message terminate="yes"/>

  1. 在 XSLT 3.0 中可以使用新的指令<xsl:try ...><xsl:catch ...>http ://www.w3.org/TR/xslt-30/#try-catch

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

下面是一个使用xsl:tryandxsl: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>
于 2012-11-23T13:57:55.283 回答
2

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

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

这是学习XSD的链接参考

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

于 2012-11-23T06:17:46.477 回答