Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

XSLT3.0への道(35) xsl:copy

いまさらですがXSLT 3.0でちょっと便利になった機能のお話の続きです.
よくノードのコピー処理で次のようなテンプレートを作ると思います.

<xsl:template match="node()">
    <xsl:copy>
        <xsl:apply-templates select="@*"/>
        <xsl:apply-templates/>        
    </xsl:copy>
</xsl:template>

<xsl:template match="@*">
    <xsl:copy/>
</xsl:template>

xsl:copyは「コンテキストアイテム」(ここでは子ノードとか属性ノード)があってくれて初めてコピーをやってくれます.これはこれで良いのですが、テンプレートの中では意図的にある要素に「位置づけて」コピーをやらせたい場合があります.このような場合、XSLT 2.0mではたいていxsl:for-eachを使うしか手がありませんでした.xsl:for-eachで強制的にコンテキストアイテムを移動させる訳です.

<!-- "/p[4]"以下だけコピーする-->
<xsl:for-each select="/p[4]">
    <xsl:copy>
        <xsl:apply-templates select="@*"/>
        <xsl:apply-templates/>        
    </xsl:copy>
</xsl:for-each>

XSLT 3.0では便利になって、xsl:copy/@selectが書けるようになりました.これでxsl:for-eachは不要となります.

<!-- "/p[4]"以下だけコピーする-->
<xsl:copy select="/p[4]">
    <xsl:apply-templates select="@*"/>
    <xsl:apply-templates/>        
</xsl:copy>

つまりxsl:copy/@selectを書くと自動的にコンテキストアイテムが移動してくれることになります.たったこれだけのことですが、時によっては大変ありがたい機能です.

XSLT 3.0の仕様はこちらです.

www.w3.org