どうにもスタイルシートの仕様がぐっちゃんぐっちゃんで決まらない時

スタイルシートを作っていて、お客様が悪いという訳ではないのですが、どうしても仕様が決まってくれないことがあります.なかなか決まりようがない、無理もありません.実際にやってみたらどうなるのか?がわからないとお客様も実装する方も判断がつかないという場合はあります.小さなプロトタイプで良いから作ってみて判断材料にしたいということになることもあります.特に文書モデルがらみで、そこでの判断が今後に大きな影響を及ぼす場合などは、納期とお金が許すならこのような方法も妥当かもしれません.

さてそれではこのような場合スタイルシートはどのように作るべきでしょうか?例えばsectionという要素の変換で、案1と案2と案3があるなら次のようにコーディングするかもしれません.

    <!--どの仕様を採用すべきかのグローバル変数(どれか一個をtrue()にします.)-->
    <xsl:variable name="pAdoptSpec1" as="xs:boolean" select="true()"/>
    <xsl:variable name="pAdoptSpec2" as="xs:boolean" select="false()"/>
    <xsl:variable name="pAdoptSpec3" as="xs:boolean" select="false()"/>
    
    <!--① 素直にxsl:chooseで分岐する-->
    <xsl:template match="section">
        <xsl:choose>
            <xsl:when test="$pAdoptSpec1">
                <!--仕様1の処理-->
            </xsl:when>
            <xsl:when test="$pAdoptSpec2">
                <!--仕様2の処理-->
            </xsl:when>
            <xsl:when test="$pAdoptSpec3">
                <!--仕様3の処理-->
            </xsl:when>
        </xsl:choose>
    </xsl:template>

しかし決して間違っていませんが、これはあとで仕様が確定した時の処理が面倒です.xsl:chooseのところをどの仕様かに沿って直さねばなりません.もっとバッサリ出来るような方法はないのでしょうか?

あります.それはパターンにグローバル変数を条件として入れることです.上記の場合だと

    <!--② パターンで分岐する -->
    <xsl:template match="section[$pAdoptSpec1]">
        <!--仕様1の処理-->
    </xsl:template>

    <xsl:template match="section[$pAdoptSpec2]">
        <!--仕様2の処理-->
    </xsl:template>

    <xsl:template match="section[$pAdoptSpec3]">
        <!--仕様3の処理-->
    </xsl:template>

と書いてテンプレートを分けてしまうのです.よくmatch属性のパターンにはノードの条件しか書けないのか?と思っている方がいます.確かにXSLT 1.0では書けませんでした.でもXSLT 2.0ではちゃんとパターンにグローバル変数が書けます.

こうするとどういう御利益があるのでしょうか?それは最終的に仕様が決まった時に、1つのテンプレートだけ残してあとをバッサリとエディタで削除してしまえば済むからです.そして例えば案1が採用された時はパターンの部分を削除して、

    <xsl:template match="section">
        <!--仕様1の処理-->
    </xsl:template>

としてやればこれで完成です.大したことはないと思う方もいらっしゃるかもしれません.しかし今まで見てきたスタイルシートで複雑でわかりづらいのはほぼ①のコーディングです.条件が複雑になっって来たとき②のようにパターンにxs:boolean型のグローバル変数が書けるありがたみが身に染みる場合も結構あるものです.