閑話休題: sequenceによるデータチェック

以前castable asで整数のデータチェックをやる例を紹介しましたが、sequenceを使えば文字列がチェックできる例を紹介します.
 
変数$dayに"Sun","Mon","Tue","Wed","Thu","Fri","Sat"のいずれかの文字列が入っているかチェックするとします.まずXSLT1.0では、バカ正直に
 
<xsl:if test="$day = 'Sun' or
                 $day = 'Mon' or
                 $day = 'Tue' or
                 $day = 'Wed' or
                 $day = 'Thu' or
                 $day = 'Fri' or
                 $day = 'Sat'">

 
としかできないでしょう.XSLT2.0ではsequenceを使ってずっとスマートにできます.
 
<xsl:variable name="dayOfWeek" as="xs:string+" select="('Sun','Mon','Tue','Wed','Thu','Fri','Sat')"/>
<xsl:if test="$day = $dayOfWeek">

 
とこれだけです.ここで思い出すのが"="です."="は、sequenceの比較オペレータでした.ですから、1つでも一致するとtrue()を返してくれるのです.
 
ですから、
 
<xsl:if test="$day eq $dayOfWeek">

 
とやると、
 
XPTY0004: Required cardinality of second operand of 'eq' is zero or one;
 
のエラーとなります.ちなみにこの例の場合
 
<xsl:if test="$day != $dayOfWeek">
 
 
もtrue()を返してしまいます.もしどれにも属していないことをチェックするなら
 
<xsl:if test="empty(index-of($dayOfWeek,$day))">
 
 
が正解でしょう.sequenceの比較は良く知っていないと大変ですね.