タグ: xml xslt コピー

XSLTでXMLの要素・属性をコピーする

基本的な事でほぼ忘備録です。

copyとcopy-of

xsltのコピーと言えば”copy”と”copy-of”がありますが、両者の違いは”copy”はカレントノードのみをコピーするのに対して、”copy-of”は指定されたノード以下の全ノードをコピーします。

[書式]
<xsl:copy>
  <xsl:apply-templates/>
</xsl:copy>

[書式]
<xsl:copy-of select=""/>

xsltを用いて属性・ノードをコピーする方法

ベースとなるxml

<content>
  <caption>伝えたい内容を明確に表現できます。</caption>
  <text style="color:red;">応じた埋め込みコードの形式で貼り付けできる。</text>
  <text>キーワードを入力して、
    <b>文書に最適な</b>
    <span style="color:red;">検索</span>
  することもできます。</text>
  <text style="font-size:14pt;" class="c1">組み合わせると、プロのような文書を作成できます。</text>
  <block style="font-size:14pt;background-color:blue;" class="c1">
    <text>組み合わせると、プロのような文書を作成できます。</text>
  </block>
</content>

変換したい内容は”text”ノードの名前を”p”へ変換し、その他はすべてのそのままとする。また、属性はすべてそのままコピーする。

変換xlst

<xsl:stylesheet version="1.0"
  xmlns:xsl=”http://www.w3.org/1999/XSL/Transform"
  xmlns:x="http://www.w3.org/1999/xhtml">

  <xsl:output method="xml" encoding="utf-8" indent="yes" />

  <xsl:template match="/">
    <xsl:apply-templates/>
  </xsl:template>

  <xsl:template match="content">
    <document>
      <xsl:apply-templates />
    </document>
  </xsl:template>
  
  <xsl:template match="text">
    <xsl:element name="p">
      <xsl:apply-templates select="node()|@*" />
    </xsl:element>
  </xsl:template>

  <xsl:template match="/|node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

変換結果

<document>
  <caption>伝えたい内容を明確に表現できます。</caption>
  <p style="color:red;">応じた埋め込みコードの形式で貼り付けできる。</p>
  <p>キーワードを入力して、<b>文書に最適な</b>
<span style="color:red;">検索</span>することもできます。</p>
  <p style="font-size:14pt;" class="c1">組み合わせると、プロのような文書を作成できます。</p>
  <block style="font-size:14pt;background-color:blue;" class="c1">
    <p>組み合わせると、プロのような文書を作成できます。</p>
  </block>
</document>

補足

xmlを読み込んでいって、textノードに差し掛かった時に、templatematch="text"の部分へ流れるようにします。その中で”p”の名前のノードを作成し、それ以下の処理はすべてコピーのテンプレートへと渡します。