web-dev-qa-db-ja.com

XSLTから例外をスローするにはどうすればよいですか?

1つのタグに属性が含まれていない場合、例外をスローしたいと思います。

_<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:try_と_xsl: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>
_
20

使用する - xsl:messageterminate="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 検証で頻繁に使用されます。

27
Petr Kozelka

XSLTは検証用ではありません!それは変換のためのものです..(XSLTはEXtensible Stylesheet Language Transformationの略です)

階層(つまり要件)を検証し、データを検証する場合は、XSDを使用してください。拡張可能なスキーマ定義。

ここにへのリンク参照があります XSDを学ぶ

XMLは、ホストコード(C#、Javaなど)によってXSDに対して検証する必要があります。検証は一連の結果を返します。検証エラー(存在する場合)で成功または失敗します。

1