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>以下をすべて持ってきている。
ただインデントも持ってくるので形が少し見づらくなっている。
