[kansaipm] XSLTでの日本語の扱いについて

KAWAI,Takanori GCD00051 at nifty.ne.jp
Tue Dec 10 07:40:20 CST 2002


川合孝典です。

先日のKOFのときPerl5.005でXSLTの日本語の取り扱いがうまく
いかないという話をききまして、ちょっと調べてみました。
今手元にPerl5.005がないので、ピントはずれかもしれませんが、
ご容赦を。(特に丸山さん)

まずPerlでXSLTということではいくつかのモジュールがあります。
代表的なものが、その名もずばりXML::XSLT。
その他にXML::Sablotron、XML::LibXSLT、XML::GDOME::XSLT、
XML:: XalanなんかがXSLTに利用できると思います。
それぞれ違いは実装方法の違い、利用しているパーザー/
ライブラリの違いです。
私の環境(MLD6 Linux)でXML::XLST、XML::Sablotron、
XML::LibXSLTをインストールして試してみました。
その結果、XML::XLSTでは出力エンコーディングがUTF8しか
ないようです。
しかし後の2つは指定さえすれば大丈夫なのではないかと思います。
インストールは多少面倒かもしれませんが(依存関係があったりして
私はちょっと苦労しました)、それを超えれば特に問題ないのではとも
思います。

なおXML::Parserを利用する場合、デフォルトでは
encoding="EUC-JP"は使えません。なぜそうなっているのか、
どうやって対処するかは下記のURLをご覧ください。

Perl XMLでencoding='Shift_JIS'や'euc-jp'を使う
http://member.nifty.ne.jp/hippo2000/perltips/xml/xmlenc.htm

以下に今回、利用したXML、XSL、コード、出力結果を示します:
[元のXML]
<?xml version="1.0" encoding="EUC-JP" ?>
<本屋>
<店名>河馬屋書店</店名>
<ロゴ>kabaya.gif</ロゴ>
<本 dsp="7">
<題>河馬の塔</題><作者>河馬谷一郎</作者><値段>1500</値段>
</本>
<本 dsp="6">
<題>河馬屋(ひっぽや)</題><作者>河馬川次郎</作者><値段>800</値段>
</本>
<本 dsp="5">
<題>写真集:河馬の群れ(カード付き)</題><作者>河馬山三郎</作者><値段>3600</
値段
>
</本>
<本 dsp="5">
<題>河馬の大国</題><作者>河馬三郎</作者><値段>3200</値段>
</本>
<img src="tel.gif"/>
<電話>HIPPO-2000</電話>
</本屋>

[XSL]
<?xml version="1.0" encoding="EUC-JP" ?>
<!-- xslの名前空間の定義 -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output encoding="EUC-JP"/>
<!-- 全体にマッチ -->
<xsl:template match="/">
        <HTML>
        <HEAD>
        <TITLE>基本形(とっても簡単)(ex.1)</TITLE>
        </HEAD>
        <BODY>
        <H1>今週の新刊</H1>
        <H2>皆様の店!</H2><xsl:value-of select="//本屋/店名"/><br/>
        <H2>電話番号</H2><xsl:value-of select="//本屋/電話"/><br/>
        </BODY>
        </HTML>
</xsl:template>
</xsl:stylesheet>

[XML::XSLTを利用したコード]
se strict;
use XML::XSLT;
my $xslt = XML::XSLT->new ('test.xsl', warnings => 1);
$xslt->transform ('test.xml');
print $xslt->toString;
$xslt->dispose ();

[その結果]

        <HTML>
        <HEAD>

<TITLE>&#22522;&#26412;&#24418;(&#12392;&#12387;&#12390;&#12418;&#31777;
&#21336;&#65289;(ex.1)</TITLE>
        </HEAD>
        <BODY>
        <H1>&#20170;&#36913;&#12398;&#26032;&#21002;</H1>
        <H2>&#30342;&#27096;&#12398;&#24215;&#65281;</H2><br />
        <H2>&#38651;&#35441;&#30058;&#21495;</H2><br />
        </BODY>
        </HTML>

[XML::Sablotronを利用したコード]
use strict;
use XML::Sablotron;
my $oSab = new XML::Sablotron();
$oSab->setOutputEncoding('EUC-JP');
$oSab->runProcessor('test.xsl', 'test.xml', 'res.xml',
   undef, undef,);

[その結果]
<HTML><HEAD><meta http-equiv="Content-Type" content="text/html;
charset=EUC-JP">
<TITLE>基本形(とっても簡単)(ex.1)</TITLE></HEAD><BODY><H1>今週の新刊
</H1><H2>皆
様の店!</H2>河馬屋書店<br><H2>電話番号</H2>HIPPO-2000<br></BODY></HTML>

[XML::LibXSLTを利用したコード]
se strict;
use XML::LibXSLT;
my $oXslt = XML::LibXSLT->new();
my $oParser = XML::LibXML->new();
my $oSrc = $oParser->parse_file('test.xml');
my $oXsl = $oParser->parse_file('test.xsl');
my $oStyle = $oXslt->parse_stylesheet($oXsl);
my $oRes = $oStyle->transform($oSrc);
print $oStyle->output_string($oRes);

[その結果]
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<TITLE>基本形(とっても簡単)(ex.1)</TITLE>
</HEAD>
<BODY>
<H1>今週の新刊</H1>
<H2>皆様の店!</H2>河馬屋書店<br><H2>電話番号</H2>HIPPO-2000<br>
</BODY>
</HTML>

===================================================
川合 孝典 (Hippo2000)
   DBI日本語メーリングリスト管理人、Kansai.pm所属
   kwitknr at cpan.org GCD00051 at nifty.ne.jp
   http://member.nifty.ne.jp/hippo2000、http://www.hippo2000.info/
perldocの日本語化ならperldocjp:もちろん参加者募集中!
  http://sourceforge.jp/projects/perldocjp
===================================================




More information about the Kansai-pm mailing list