😝

[XSLT] xsl:assert

に公開

https://adventar.org/calendars/11635

XSLT 3.0デバッグまわり Advent Calendar 2025 の2日目の記事です。
今日は小ネタ。

XSLT 3.0でのxsl:message

XSLT 1.0とXSLT 3.0のxsl:messageにはちょっと違いがあります。3.0では次のように拡張されています。

  • 要素の下でSequence Constructorを書く代わりに@select属性にXPath式を書ける
  • @error-code属性で、エラーコードを上書きできる

@selectについては色んな箇所で使えるようになった一環という感じですが、@error-codeはエラーコードを上書きできるものです。
ちなみに@terminate="yes"のとき、デフォルトのエラーコードはXTMM9000です。

xsl:assert

xsl:assertは、XSLTのassertionである。……昨日見た? そうかも。

<xsl:template match="p">
    <xsl:assert test="exists(text())" select="trace(.) || 'p has no text!'"/>
    <xsl:apply-templates/>
</xsl:template>
  • @testのexpressionを評価した結果がtrue()であるとき、アサーション成功、何もしない
  • @testのexpressionを評価した結果がfalse()であるとき、または@testのexpressionの評価自体が失敗するとき、アサーション失敗、xsl:messageで@terminate="yes"のときのように振る舞う

とまあ、xsl:message+xsl:ifという説明で概ねよいわけですね。
一致しない点としてエラーコードのデフォルトはXTMM9001となります。
また、xsl:ifの条件式の評価失敗とxsl:messageによるエラーコードは別に扱われますが、xsl:assertでは処理が一体なので、これもdiffですね。

参考資料

https://www.w3.org/TR/xslt-30/#assertions

https://toshi-xt500.hatenablog.com/entry/18111740

https://www.saxonica.com/html/documentation12/xsl-elements/assert.html

組版・ドキュメンテーション勉強会

Discussion