ソースXML文書のノードをコピーする場合、xsl:copy要素を使用することもできる。xsl:copyでは、その要素内容の指定により、ソース文書の内容をそのままコピーしたり、内容を変更しつつコピーすることができる。
以下は、ソース文書内容をそのままコピーするスタイルシートである。
ソース文書:
XSLTスタイルシート:
このスタイルシートでは、まず、ルートノードに対して、xsl:copyによるコピーを行うテンプレートルールが適用される。xsl:copyの要素内容は、全てのノード及び属性に対する、同じテンプレートルールの再帰的な呼び出しとなっているので、順次全てのノード及び属性がコピーされる。
。。。のだけど、今ひとつイメージがわかないところも。テキストノードに対してこのテンプレートルールが適用された場合、まずテキスト自身がコピーされるのだろう。そしてxsl:apply-templatesを処理するときに、テキストノードだからその子ノードや属性が存在しないので、それ以上テンプレートを適用する対象なし、ということになるのだろうか? うーむ。
【XSLTプロセッサ】XALAN 2.7.0 / msxsl
【OS】Windows XP Professional Edition + SP2
以下は、ソース文書内容をそのままコピーするスタイルシートである。
ソース文書:
<?xml version="1.0"> <First order="1st"> <Second order="2nd">2nd element</Second> </First> |
XSLTスタイルシート:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">   <xsl:output method="xml" encoding="UTF-8"/>   <xsl:template match="node()|@*">     <xsl:call-template name="copy"/>   </xsl:template>   <xsl:template name="copy">     <xsl:copy>       <xsl:apply-templates select="node()|@*" />     </xsl:copy>   </xsl:template> </xsl:stylesheet> |
このスタイルシートでは、まず、ルートノードに対して、xsl:copyによるコピーを行うテンプレートルールが適用される。xsl:copyの要素内容は、全てのノード及び属性に対する、同じテンプレートルールの再帰的な呼び出しとなっているので、順次全てのノード及び属性がコピーされる。
。。。のだけど、今ひとつイメージがわかないところも。テキストノードに対してこのテンプレートルールが適用された場合、まずテキスト自身がコピーされるのだろう。そしてxsl:apply-templatesを処理するときに、テキストノードだからその子ノードや属性が存在しないので、それ以上テンプレートを適用する対象なし、ということになるのだろうか? うーむ。
【XSLTプロセッサ】XALAN 2.7.0 / msxsl
【OS】Windows XP Professional Edition + SP2