スポンサーリンク

[XSLT] xsl:copyとxsl:copy-ofの使い方

xsl:copyの使い方

copyはコンテキストノードのみのコピーをする。
copy内に<apply-templates>で指定したテンプレートを呼べばそれもコピーする。

xsl:copy-ofの使い方

copy-ofはselect属性に指定したノード以下すべてをコピーする。

サンプルコード

XML

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="sample.xsl"?>
<root>
    <data>
        <name>宮下</name>
        <age>19</age>
        <department>開発部</department>
    </data>
</root>

XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <xsl:apply-templates select="root/data"/>
    </xsl:template>

    <xsl:template match="root/data">
        <copy箇所>
            <xsl:copy>
                
            </xsl:copy>        
        </copy箇所>
        <copy-of箇所><xsl:copy-of select="."/></copy-of箇所>
    </xsl:template>

</xsl:stylesheet>

実行結果

<?xml version="1.0" encoding="UTF-8"?>
<copy箇所>
<data />
</copy箇所>
<copy-of箇所><data>
        <name>宮下</name>
        <age>19</age>
        <department>開発部</department>
    </data></copy-of箇所>

解説

copy

実行結果を見ると、xmlにインデントがあるので、それもコピーされて少々見づらくなっている。

<copy箇所>
<data />
</copy箇所>

copyで実行したほうはこれだけ。カレントノードが<data>要素だからこれしかとっていない。

<xsl:apply-templates select=”name”/>をcopy要素内にて呼び出すと下記にの通りになった。

<copy箇所>
<data>宮下</data>
</copy箇所>

<name>のテキストノードのみ取得した結果となった。
要素ノードを持ってくるのかと思ったら持ってこなかった。

正直よくわからない。
ちなみにcopy要素を外してみたらapplyだけでも<data>が消えただけで中身は同じ。

結局copyがやってるのは、カレントノードの要素タグ持ってくるだけの機能にみえる。

copy-of

<copy-of箇所><data>
        <name>宮下</name>
        <age>19</age>
        <department>開発部</department>
    </data></copy-of箇所>

copy-ofのほうは見ての通り<data>以下をすべて持ってきている。
ただインデントも持ってくるので形が少し見づらくなっている。

XSLT
スポンサーリンク
シェアする
trelab