ぽっくるのITざっき

IT関連技術についての覚え書きです。不定期更新です。

【XSLT】ノードをコピーするには②

2007-12-23 01:23:54 | Weblog
ソースXML文書のノードをコピーする場合、xsl:copy要素を使用することもできる。xsl:copyでは、その要素内容の指定により、ソース文書の内容をそのままコピーしたり、内容を変更しつつコピーすることができる。

以下は、ソース文書内容をそのままコピーするスタイルシートである。

ソース文書:
<?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