Xerces/Xalan-C++ で XML

XSLT の単純なプログラミング

最終更新: 2015-04-01 (水) 20:35:08 (1358d)

概要

このページで説明するコード

XSLT を使うための道具を整備する

Xalan-C++ とは、XSLT(eXtensible Stylesheet Language Transformations)を処理してくれるライブラリだ。 XSLT とは、XML ドキュメントを別のドキュメント(XML であるとは限らない)に変換するための言語である。 XSLT の記述に従いドキュメントの変換を行ってくれるソフトウェアのことを XSLT プロセッサという。 すなわち、Xalan-C++ は XSLT プロセッサを提供してくれる。 名前の後ろに付いている通り、C/C++ で使うことができる。

上のリンクをたどると Xalan-C++ のページに行ける。 英語で書かれたページだけど、ダウンロード&セットアップをがんばって済ませよう。 ダウンロードは自分のプラットフォーム(OS)を間違えないこと。 セットアップでするべきことを以下に簡単に挙げる。

※ Microsoft Visual C++ 2010 Express で試したのだが最新のバージョンは動かず、Xerces-C++ 2.3.0 と Xalan-C++ 1.6.0 の組み合わせでやっと動作した。そのため本ページでは 1.6.0 のセットアップ方法を説明している。それでもまだ問題があり、ファイル名を指定した出力は動作するがストリーム(cout や cerr)を指定した出力は動作しなかった。他の OS およびコンパイラーを使用した場合はまた状況が違うと思うので最新のバージョンを試してみてもいいだろう。

  • インクルードパスを設定する
    • Xalan-C_1_6_0/c/src
  • ライブラリパスを設定する
    • Xalan-C_1_6_0/c/Build/Win32/VC6/Debug
    • Xalan-C_1_6_0/c/Build/Win32/VC6/Release
  • 実行パスを通すか、または DLL を実行パスの通ったディレクトリへコピーする
    • Xalan-C_1_6_0/c/Build/Win32/VC6/Debug
    • Xalan-C_1_6_0/c/Build/Win32/VC6/Release

同時に Xalan-C++ のバージョンに対応した Xerces-C++ にも同じ設定が必要である。

  • インクルードパスを設定する
    • xerces-c_2_3_0-win32/include
  • ライブラリパスを設定する
    • xerces-c_2_3_0-win32/lib
  • 実行パスを通すか、またはDLLを実行パスの通ったディレクトリへコピーする
    • xerces-c_2_3_0-win32/bin

必ず Xalan-C++ が対応しているバージョンの Xerces-C++ を利用することが大前提です。バージョンを揃えないとコンパイルはうまく行っても、リンクが上手く通らない。

Xalan-C++ 1.6.0 は Xerces-C++ 2.3.0 と組み合わせて利用する。

Xerces-C++ の最新は 3 系に移行しているが、2011/10/23 現時点では Xerces-C++ 3 系に対応した Xalan-C++ はない模様で XSLT を利用したい場合は Xerces-C++ は 2 系 を利用せざるを得ない。

ちなみに Xalan-C++ 1.6.0 ~ 1.10 までの Xerces-C++ バージョンの対応は以下の通りである。

Xalan-C++Xerces-C++
1.62.3
1.72.3, 2.4
1.82.5
1.92.6
1.102.7

XalanTransformerを使う

Xalan を使った XSLT のプログラミングは実に簡単である。 fileexample.xsl に書かれた変換規則に従って fileexample.xml を変換するプログラムを書こう。 filemain.cpp の一部を以下に示す。

#include <iostream>
using namespace std;

#include <xercesc/util/PlatformUtils.hpp>
using namespace xercesc;

#include <xalanc/XalanTransformer/XalanTransformer.hpp>
using namespace xalanc;

int main() {
  // Xerces & Xalan-C++を初期化する
  try {
    XMLPlatformUtils::Initialize();
    XalanTransformer::initialize();
  } catch(...) {
    cerr << "Xerces & Xalan-C++の初期化に失敗しました。" << endl;
    return 1;
  }

  // 文章を変換する
  XalanTransformer transformer;
  if (0 != transformer.transform("example.xml", "example.xsl", "output.xml")) {
    cerr << "Error: " << transformer.getLastError() << endl;
  }

  XalanTransformer::terminate();
  XMLPlatformUtils::Terminate();

  return 0;
}

Xalan-C++ における XSLT プロセッサは、XalanTransformer クラスである。 まず XalanTransformer は、 使う前に XMLPlatformUtils::Initialize メソッド及び XalanTransformer::initialize メソッドで初期化しなければならない。

XMLPlatformUtils::Initialize メソッドは、Xerces-C++ の初期化である。Xalan-C++ は内部で Xerces-C++ を使用している。

さらに使い終わったら XalanTransformer::terminate メソッドおよび XMLPlatformUtils::Terminate メソッドで終了しなければならないことを覚えよう。

XalanTransformer クラスは、transform メソッドを使うことで 指定された XSL ファイルの記述に従って XML ファイルを別のドキュメントに変換できる。

この場合、変換した結果は output.xml ファイルに出力される。 fileexample.xsl に書かれている変換規則の内容を以下に示す。

  • root-elementタグを、translated-rootタグに変換する
  • element1タグを、translated-element1タグに変換する
  • element2タグを、translated-element2タグに変換する
  • element3タグを、translated-element3タグに変換する

出力結果は以下のようになる。

<?xml version="1.0" encoding="Shift_JIS"?>
<translated-root>
	<translated-element1>sample1</translated-element1>
	<translated-element2>
<translated-element3>sample3</translated-element3>
	</translated-element2>
</translated-root>

コメント

最新の10件を表示しています。 コメントページを参照

  • VC10 で色々試しつつ、記事を編集しているのですが、実際のところうまく動いていません。transform の第3引数にファイル名を指定した場合は出力されるのですが、ストリーム(例えば cout 等)を指定した場合は空文字が返ってくる問題に遭遇しています。誰か情報を持っている人いませんか?^^; -- トゥイー 2011-10-24 (月) 15:04:00
お名前: