- PR -

XSL - 特殊文字を入れるには?

1
投稿者投稿内容
fuzuki
常連さん
会議室デビュー日: 2003/08/23
投稿数: 48
投稿日時: 2006-03-02 14:01
XSLTで特殊文字を含んだ文書を生成したいと思っています。
具体的に使用しなければならない文字はUnicodeの0007のBELです。ネットで調べたところ、

コード:
<!DOCTYPE test [
<!ENTITY copy "&#169;">
]>
<test>
&copy;
</test>



のように書けば使えると書かれていましたが、実際に処理してみるとエラーが出ます。エラーの内容は以下のとおりです。使用しているXSLTプロセッサはsaxonです。

コード:
Error on line 3 column 4 of file:/C:/0/x.xsl:
  Error reported by XML parser: expected comment or CDATA section (found "D")
Transformation failed: Failed to parse stylesheet



ご存知の方がいらっしゃいましたらよろしくお願いいたします。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2006-03-02 15:37
提示の コードは無関係では

エラーメッセージを無料翻訳サイトに投げ込みます、からだを動かす。

file:/C:/0/x.xsl の 3行の4カラム の上のエラー
XMLパーザによって報告されたエラー:予期されたコメントあるいはCDATAセクション(「D」を見つけた)
変形は失敗しました: スタイル・シート を解析するに失敗されました。

結論:スタイル・シートをよく見る
fuzuki
常連さん
会議室デビュー日: 2003/08/23
投稿数: 48
投稿日時: 2006-03-03 07:50
MMXさん、返信ありがとうございます。
そうですね。いろいろ試しすぎて混乱していました。
エラーが出ていた3行目の部分は"<!DOCTYPE test ["なのですが、これを以下のようにしてみましたが、これでもまだ同じエラーが出ます。

コード:
<!DOCTYPE xsl:stylesheet [
<!ENTITY bel "&#x0007;">
]>



また、DOCTYPEで宣言するのをやめて、以下のように直接指定してみたところ別のエラーが出ました。

コード:
<xsl:text>&#x0007;</xsl:text>



コード:
Error on line 32 column 21 of file:/C:/0/x.xsl:
  Error reported by XML parser: illegal XML character reference U+7
Transformation failed: Failed to parse stylesheet



このエラーは理由が分かりません。U+7は意図したBELマークのはずなのですがなぜ不正な文字と言われるのか・・・
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2006-03-03 09:29
細木数子のように言います
「からだを動しなさい、そうしないと地獄に落ちるわよ」
翻訳サイトに 被害者の ダイイング・メッセージを 投げ込みます。

Error reported by XML parser: illegal XML character reference U+7
↓ とは?
XMLパーザによって報告されたエラー:不法なXML人物証明書 U+、7
訳語のエラー、character reference → 人物証明書

では、次の賢者(翻訳サイト)に聞きに行きます
誤りはXMLパーサで報告しました: 不法なXML 文字参照 U+7

では、XMLに使える文字コード を調べる旅に 出発です。 続く
fuzuki
常連さん
会議室デビュー日: 2003/08/23
投稿数: 48
投稿日時: 2006-03-03 14:27
XMLは全てのUnicodeを使えるわけではないのでしょうか?

以下のページには「JavaやXMLは、基本コードとして、Unicodeを採用しています。」と書かれていますし、また、「UTF-8は、UnicodeとASCIIコードを混在させるための規格です。Unicodeでは、0x0000-0x007Fの文字コードは、ASCIIコードの0x00-0x7Fと同じとなっていることを利用して変換します。」とも書かれています。

http://ash.jp/code/code.htm

問題のBELマークはUnicodeでU+0007であることは以下のページで確認しました。
http://www.unicode.org/charts/PDF/U0000.pdf
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2006-03-03 15:26
弁護士のように 確認,確認

やさしく読む「XML 1.0勧告」
http://www.atmarkit.co.jp/fxml/indexes/index_col.html#xe13
5.「整形式」のXML文書と文字の定義
http://www.atmarkit.co.jp/fxml/rensai/w3cread05/w3cread05.html
■XMLで定める「文字」とは?
さて、文字のEBNFによる定義は以下のようになっている。

そのようになった理由は
第1回 XMLの仕様書によると、XMLの目標とは……
http://www.atmarkit.co.jp/fxml/rensai/w3cread01/w3cread01.html
文書指向の「軸」があるのがわかります。(歴史と言うもの)

データ指向の人々は XML1.1を立てました。
XML 1.1では、文字参照を使うことで文書の中に制御文字を持てるようになっています。これらは #x1 から #x1F までの制御文字ですが、XML 1.0ではその大部分が禁止されています。

パーサーが1.1仕様で動作可能なら 使えます。
ただし、他にそのxmlデータを持って行くときは知りません。
=================
生の [BEL] は置けないが 文字符号化(BASE64など)したり
MIME で外部の実体にすると バイナリは置けます。
================
以上、からだを1時間ていど動かすと、理解できます

[ メッセージ編集済み 編集者: MMX 編集日時 2006-03-03 15:39 ]
fuzuki
常連さん
会議室デビュー日: 2003/08/23
投稿数: 48
投稿日時: 2006-03-06 08:57
教えていただいたページを読んでやっと特定の文字が使えない理由が分かってきました。

Base64でエンコードする方法も考えてみましたが、XSLTで生成されたデータはPHPに渡してさらに処理する予定なので、特殊文字の部分だけPHPで変換させることにします。

今まで何気なく使っていましたが、思いもかけず改めてXMLの勉強ができて為になりました。ありがとうございました。
1

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