AH Formatter / XSL Formatter
Q&A



XSLT/XSL-FO/MathML テクニック

エンティティ

トップ
基本・一般
AH Formatter について
XSL Formatter について
操作方法
プログラミング
XSLT/XSL-FO/SVG/MathML 仕様について
XSLT/XSL-FO/MathML テクニック
索引
Q.  entity参照を使用して、外部のファイル(外部エンティティ)をFOに組み込もうとしたのですが、組版結果に反映されません。なぜですか。 [No.2002111502]
A. 

この現象はパーサにMSXMLを使用しているために発生します。

例を示して説明します。

[ファイル名:test.fo]

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [ <!ENTITY testseg SYSTEM "testseg.fo"> ]>
<root xmlns="http://www.w3.org/1999/XSL/Format" >
  <layout-master-set>
    <simple-page-master master-name="frame">
      <region-body region-name="frame-body"/>
    </simple-page-master>
  </layout-master-set>

  <page-sequence master-reference="frame">
    <flow flow-name="frame-body">
      &testseg;
    </flow>
  </page-sequence>
</root>

[ファイル名:testseg.fo]

<block>
    This is a test
</block>

MSXML はエンティティごとに namespace の指定がないと null namespace (namespaceなし)であるとみなされます。つまり展開元(testseg.fo)の block の namespace が展開先(test.fo) の方に指定されている namespace 指定に変わるようなことはありません。したがって、次のように展開されます。

[ファイル名:test.fo(展開後)]

<?xml version="1.0" encoding="utf-8"?>
<root xmlns="http://www.w3.org/1999/XSL/Format" >
  <layout-master-set>
    <simple-page-master master-name="frame">
      <region-body region-name="frame-body"/>
    </simple-page-master>
  </layout-master-set>

  <page-sequence master-reference="frame">
    <flow flow-name="frame-body">
      <block xmlns="">This is a test</block>
    </flow>
  </page-sequence>
</root>

エンティティ名「&testseg;」が「 <block xmlns="">This is a test</block>」と展開されます。「xmlns=""」は FO namespace ではないので XSL Formatter は処理をせずに無視します。これにより、組版結果に反映されないのです。
これを回避するためには外部エンティティ(testseg.fo)の block にもFO namespaceを宣言すれば解決します。

[ファイル名:testseg.fo(修正後)]

<block xmlns="http://www.w3.org/1999/XSL/Format">
    This is a test
</block>

Copyright © 1999-2011 Antenna House, Inc. All rights reserved.
Antenna House is a trademark of Antenna House, Inc.