- PR -

saxonの日本語出力について

1
投稿者投稿内容
doza
会議室デビュー日: 2002/03/05
投稿数: 3
投稿日時: 2002-03-05 19:22
はじめて投稿します。ご無礼の際は平にご容赦ください。

現在、xhtmlをhtmlに変換するというプログラムをxsltで組んでいます。
プロセッサはsaxson 6.5.1(たぶん最新)を使用しており、そのsaxonの
サイトによると、出力は日本語はUTF-8をサポートしているとの事でした。

出力の方法としては、xslt 1.1でサポートされたばかりの、<xsl:document>
を使った別ファイルへの書き出し、というものです。

この<xsl:document>および<xsl:output>で、method="xml"を指定すると、
確かにUTF-8で日本語が出力されるのですが、method="html"だと、日本語が
数値文字参照「&#12354; のような形式」になります。
これでブラウザでは普通に表示できるのですが、ファイルは重くなります。

saxsonのサイト
http://saxon.sourceforge.net/saxon6.5.1/xsl-elements.html

では、method="html"を指定した時の結果については特に説明がなかったよう
なので(私が見落としてるだけかもしれませんが)、そこが気になります。

皆さんの中で、似たような事を経験された方はおられますでしょうか。
ご助言いただけると幸いです。
miki
大ベテラン
会議室デビュー日: 2001/09/21
投稿数: 174
お住まい・勤務地: 東京都八王子市
投稿日時: 2002-03-06 10:53
DocBookを書いていて私も同様の問題を抱えていましたが、スタイルシートに以下のように設定することで解決しました。

コード:
  <xsl:output method="html"
               encoding="utf-8"
               indent="no"/>

   <xsl:param name="default.encoding" select="'utf-8'"/>
   <xsl:param name="saxon.character.representation" select="'native'"/>

doza
会議室デビュー日: 2002/03/05
投稿数: 3
投稿日時: 2002-03-07 16:27
miki様

さっそくのご返答ありがとうございます。

ご教授いただいた方法は、グローバルパラメタを定義し、それに
何らかの定数を渡すという事はなんとなくわかったのですが、思
った通り、それだけではうまくいかなかったので、色々調べてみ
たところ、saxonシリアライザ(「XSLTバイブル」p740)というもの
がありました。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns:saxon="http://icl.com/saxon" (追加)
version="1.1"
extension-element-prefixes="saxon" (追加)
exclude-result-prefixes="xhtml">

<xsl:output method="html"
encoding="UTF-8"
indent="yes"
saxon:character-representation="native;entity" (追加)
/>

これがご教授いただいた方法と近い指定のため、試してみたところ、
うまく日本語が出力されました。

当初、saxonを選んだのも、「プロセッサの実装依存はなるべく避け
たい」という前提があったからなのですが、結果的にはsaxon独自の
機能を使う事になりました。

なので、miki様の方法が本来は理想とも思われるのですが、グローバ
ルパラメタの他に何が必要なのか、ご提示いただけると幸いです。

まったく初心者な質問で恐縮ですが。
miki
大ベテラン
会議室デビュー日: 2001/09/21
投稿数: 174
お住まい・勤務地: 東京都八王子市
投稿日時: 2002-03-07 19:03
dozaさん、

docbookのパラメタの指定方法だけではわかるはずないですよね。
舌足らずですみませんでした。

以下が私のスタイルシートの全文です。
docbookをimportして変更するパラメタだけ上書きしています。

コード:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
		version="1.0">
   <xsl:import href="../../../docbook-xsl-1.48/html/chunk.xsl"/>
  <xsl:param name="default.encoding" select="'UTF-8'" /> 
  <xsl:param name="saxon.character.representation" select="'native'" /> 
</xsl:stylesheet>



chunk.xslをざっとながめてみるとdozaさんの指定したのと同じ方法で、xsl:outputのsaxon:character-representation属性に上で指定したパラメタを渡しているだけです。
ちなみに、chunk.xslのヘッダの部分は次のように指定されています。

コード:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:saxon="http://icl.com/saxon"
                xmlns:lxslt="http://xml.apache.org/xslt"
                xmlns:xalanredirect="org.apache.xalan.xslt.extensions.Redirect"
                xmlns:exsl="http://exslt.org/common"
                xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
		version="1.1"
                exclude-result-prefixes="doc"
                extension-element-prefixes="saxon xalanredirect lxslt exsl">



というわけで、これもsaxon依存の方法でした。

saxonを使った別の方法として、コマンド引数としてXML parserを渡す方法があります(-x classname)。これでXercesを指定すれば、UTF-8以外のエンコーディングでもOKです。

でも、最初からXalanを使うのが最も簡単だと思います。
Xalanでは駄目ですか?
doza
会議室デビュー日: 2002/03/05
投稿数: 3
投稿日時: 2002-03-08 17:41
miki様

ありがとうございます。

saxonを使う事にした理由というのが、まず、一つのxhtml(xml)から
章や節ごとに別のファイルに出力する必要があって、その手段とし
てXSLT1.1で提案された仕様をサポートしているのがsaxonだったか
らです。

XSLT1.1も決定ではないものの、やはりそれに従った作りにしておく
のがベターかと考えていました。

その上でこの問題が出て、試行錯誤していたのですが、Xalanで日本
語が出力でき、別ファイル書き出しの方法も似ているようなので、
この方法でだめならXalanで、という事も考えていました。

結果的には、プロセッサ依存の部分が出てしまったわけですが、どう
も避けられない事だったようですね。
たまたま読んだ「saxonシリアライザ」という仕様がmikiさんの方法と
似ていなかったら、何も気づかなかった事でしょう。

methodが"xml"か"html"かで同じencodeの出力のされ方が違うなど考え
てもいなかったのですが、熟練されている方には当たり前の事なので
しょうか。この点には非常に興味があります。
miki
大ベテラン
会議室デビュー日: 2001/09/21
投稿数: 174
お住まい・勤務地: 東京都八王子市
投稿日時: 2002-03-09 01:02
saxonのことならsaxonのメーリングリストを探した方が効率的でしたね。
質問の答えが以下のURLに書いてありました。Mike Kay本人からの回答です。

http://sourceforge.net/mailarchive/message.php?msg_id=77069

御参考まで。
1

スキルアップ/キャリアアップ(JOB@IT)