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