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 xmlns="http://www.w3.org/1999/XSL/Format"> This is a test </block> |