カテゴリー別アーカイブ: XSL-FO・CSS

Table のアクセシビリティ

現在 table のアクセシビリティについての開発を行っているのですが、最近社内で XSLT 勉強会に参加しているせいか、ふと、XSLT でどうすれば自動的にアクセシビリティ対応が図れるのか気になったので検討してみたいと思います。なお、今回はアクセシビリティ関連の属性の内 scope 属性に関してのみ焦点を当てます。複雑な表の場合、headers属性の使用が推奨されていますが、現時点の私の技術力ではとても自動化などできそうにないので、今回は scope 属性に絞らせていただきました。ちなみに、scope 属性は HTML5 と同様のものだとさせて頂きます。また、XSL-FO プロセサが scope 属性に対応しているとします。

table 自体のスキーマは以下の様になっているとします。普通は、thr と tr を分けるような事はしないとおもいますが、今回は問題を簡易化にするために分けています。また、theader 内の見出しは列方向に対するもの、tbody 内の見出しは行方向に対するものとします。

table := (theader)?,(tbody)+
theader := thr
tbody := (tr)+
thr := (th)+
tr := (th)?,(td)+
th := 見出し
td := データ

また、th に対するテンプレートしか載せませんが、以下の様になっているとします。

<xsl:template match="th">
    <fo:table-cell>
      <fo:block>
        <xsl:apply-templates/>
      </fo:block>
    </fo:table-cell>
</xsl:template>

以下の様に theader が一行で、th が theader 内にしか存在しない場合だと簡単そうですね。

  <table>
    <theader>
      <thr>
        <th>見出し1</th>
        <th>見出し2</th>
        <th>見出し3</th>
      </thr>
    </theader>
    <tbody>
      <tr>
        <td>データ11</td>
        <td>データ12</td>
        <td>データ13</td>
      </tr>
      <tr>
        <td>データ21</td>
        <td>データ22</td>
        <td>データ23</td>
      </tr>
    </tbody>
  </table>

scope 属性を値 col で追加すればそれで対応完了です。後の事を考え、以下の様に <xsl:choose> を使い、th の祖先ノードを見て scope 属性を付与するということをします。

 <xsl:template match="th">
    <fo:table-cell>
      <xsl:choose>
        <xsl:when test="../../self::theader">
          <xsl:attribute name="scope">col</xsl:attribute>
        </xsl:when>
      </xsl:choose>
      <fo:block>
        <xsl:apply-templates/>
      </fo:block>
    </fo:table-cell>
</xsl:template>

次はスキーマに沿った、tbody の一列目にも th 存在する場合も考えてみます。

   <table>
    <theader>
      <thr>
        <th>見出し1</th>
        <th>見出し2</th>
        <th>見出し3</th>
      </thr>
    </theader>
    <tbody>
      <tr>
        <th>見出し11</th>
        <td>データ11</td>
        <td>データ12</td>
      </tr>
      <tr>
        <th>見出し12</th>
        <td>データ21</td>
        <td>データ22</td>
      </tr>
    </tbody>
  </table>

tbody の最初の子 th に値 row で scope 属性を与えれば良いだけなので簡単ですね。また、入力 XML がスキーマに沿わない場合に備え、<xsl:otherwise> 節を追加してエラー処理を追加するのも良いかもしれません。

 <xsl:template match="th">
    <fo:table-cell>
      <xsl:choose>
        <xsl:when test="../../self::theader">
          <xsl:attribute name="scope">col</xsl:attribute>
        </xsl:when>
        <xsl:when test="../../self::tbody and position()=1">
          <xsl:attribute name="scope">row</xsl:attribute>
        </xsl:when>
      </xsl:choose>
      <fo:block>
        <xsl:apply-templates/>
      </fo:block>
    </fo:table-cell>
</xsl:template>

今回はすごく簡単な例しか取り上げませんでしたが、次回までに私の XSLT 力が向上していたら複雑な表や、多種の表の場合を扱ってみたいと思います。恐らく多種の複雑な表を扱う場合、自動での scope 属性の付与は難しく、入力スキーマ自体に表の種類に関する情報を入れたりする必要が出てきそうです。


AH Formatter 機能のご紹介:オーバープリントの設定

AH Formatter』では、V6.2 改訂2版よりオーバープリントが指定できるようになりました。
axf:overprint / CSS -ah-overprint(オンラインマニュアル)

『AH Formatter』のサンプルFO集には、
本機能が確認できるサンプル「オーバープリントの設定例(axf:overprint)」を掲載しております。

『AH Formatter』は主にバージョンアップのたびに機能強化や新機能の追加を行っています。
“あったら便利な機能” も既に追加されていることがございますので、
お気軽にサポートにお問い合わせください。
未実装の機能であれば、ご要望として承り、今後の開発の参考にさせていただきます。

『AH Formatter』の評価版は次のページよりお申し込みいただけます。ご興味のある方は是非お試しください。
AH Formatter 評価版のお申し込み

弊社ではご検討中のお客様向けに技術相談会を行っております。お気軽にお問い合わせください。
アンテナハウス システム製品技術相談会

 


XSL-FO&AH Formatter 使いこなし技のご紹介

『AH Formatter』のサンプルページでは、
「XSL-FO&AH Formatter 使いこなし技」と称して、
XSL-FO や『AH Formatter』を使いこなすための便利な小技・裏技を紹介しています。

今のところ次の2例のみですが、
今後 XSL-FO/CSS 及び『AH Formatter』ユーザ様のお役に立つよう増やしてまいります。

表の泣き別れを float で回避する例
keep-together.within-page=”always” の指定で改ページされる fo:table-row、fo:list-item のオーバーフローを回避する例

『AH Formatter』の評価版は次のページよりお申し込みいただけます。ご興味のある方は是非お試しください。
AH Formatter 評価版のお申し込み

弊社ではご検討中のお客様向けに技術相談会を行っております。お気軽にお問い合わせください。
アンテナハウス システム製品技術相談会

 


AH Formatter 機能のご紹介:<fo:page-sequence> の入れ子

AH Formatter V6.3』では、<fo:flow> 直下に <fo:page-sequence> を記述して入れ子にできるように拡張されました。
入れ子の <fo:page-sequence>(オンラインマニュアル)

また、<fo:flow> を省略した空の <fo-page-sequence> が許容されようになりました。

『AH Formatter』のサンプルページには、
本機能が確認できるサンプル「fo:page-sequence の入れ子と空の fo:page-sequence の設定例(fo:page-sequence)」を掲載しております。
オンラインマニュアルと併せてご覧ください。

『AH Formatter』の評価版は次のページよりお申し込みいただけます。ご興味のある方は是非お試しください。
AH Formatter 評価版のお申し込み

弊社ではご検討中のお客様向けに技術相談会を行っております。お気軽にお問い合わせください。
アンテナハウス システム製品技術相談会

 


AH Formatter 機能のご紹介:axf:border-wave-form

AH Formatter V6.3』では、border-style=”wave” の形状(波長と線幅)を axf:border-wave-form で指定できるようになりました。
axf:border-wave-form / CSS -ah-border-wave-form(オンラインマニュアル)

AH Formatter 組版例
– axf:border-wave-form を利用した組版例 –

『AH Formatter』のサンプルページには、
本機能が確認できるサンプル「波枠線と形状の指定例(border-style=”wave”)」を掲載しております。
オンラインマニュアルと併せてご覧ください。

『AH Formatter』の評価版は次のページよりお申し込みいただけます。ご興味のある方は是非お試しください。
AH Formatter 評価版のお申し込み

弊社ではご検討中のお客様向けに技術相談会を行っております。お気軽にお問い合わせください。
アンテナハウス システム製品技術相談会


XSLTを学ぶ (2) ノードツリーとノードの親子、子孫関係

前回([1])はXPathでは7つのノードが定義されている、と説明しました。このうち重要なのは、ルートノード、要素ノード、属性ノード、テキストノードです。この4種類のノードについてもう少し詳しく見てみましょう。

例えば次のようなXML文書があったとします。このXMLの文書要素はdocです。

<!–?xml version=”1.0″?–>
 <doc>
  <body>
   <p s=”man1″>Hello! How are you?</p>
   <p s=”man2″>I am fine, thank you.</p>
  </body>
 </doc>

このXMLをXPathのノードツリーとして表しますと次のようになります。
XSLT

ノードには親子(parent, child)になるものがあります。ノードツリーで実線でしめした箇所が親子関係になります。子孫(descendant)ノードとはあるノードの子供と子供の子孫ノードです。

兄弟(sibling)ノードは同じ親の子供ノードです。

親になれるノードはルートノードと要素ノードのみです。子供になれるノードは要素ノードとテキストノードです。ルートノードは最上位ですので親をもちません。逆にテキストノードは最下位ですので子を持ちません。

やっかいなのは属性ノードです。要素には関連する属性があります。要素ノードはそれらの属性ノードの親です。しかし、属性ノードは要素の子ではないと規定されています。また属性ノードは子を持ちません。

属性ノードとして扱われるのは、要素に明示的に指定されているもの、または、DTDでデフォルト値が明示的に規定されているものです。DTDで値が#IMPLEDになっていて要素に指定されていない属性や、xml:lang、xml:spaceのようなある要素に指定されているとき、その子孫に継承することになっている属性は、その子孫では属性ノードとして扱われません。

テキストノードは、要素の内容の文字列をできるだけ長くなるように結合したものです。従って、テキストノードには、直前・直後の兄弟はありません。

要素ノードの文字列値とは、要素ノードの子孫であるテキストノードを、XML文書に現れる順に結合したものです。ルートノードの文字列置はXML文書のすべてのテキストです。

[1] XSLTを学ぶ (1) XMLのツリーモデルとXPath/XSLTのツリーモデルではルートの意味が違う
[2] XPath データモデル

★AH Formatter XML関連出版物の紹介

次回:
XSLTを学ぶ(3)パスとは

初回:
XSLTを学ぶ(1)XMLのツリーモデルとXPath/XSLTのツリーモデルではルートの意味が違う


[書籍のご案内] スタイルシート開発の基礎 – XML と FO で簡単な本を作ってみよう

この度、弊社執筆による「スタイルシート開発の基礎」のプリントオンデマンド(POD)による紙版が発売になりました。

スタイルシート開発の基礎
目次の一覧は、こちらでご覧ください。

本書は XSLT の入門書です。XML の初心者が、XML を処理して XSL-FO に変換するスタイルシートを書きながら、弊社の『AH Formatter』を利用して、PDF形式の「簡単な本」を組版することを目的としています。簡単なスタイルシートから書いていき、徐々に必要な追加を行って、「簡単な本」を組版するためのスタイルシートを完成させていきます。本書自体、本文で解説しているスタイルシートにいくらかの修正をしたもので作成されておりますので、完成物のイメージが湧きやすくなっています。

本書は、Amazon.co.jp三省堂オンデマンド(「オンデマンド和書(その他出版社)」の項)などからご注文いただけます。

 


AH Formatter V6.3 のご紹介:axf:float-x=”alternate”

AH Formatter V6.3』では、段組内に配置するフロートの水平(縦書きでは垂直)方向を axf:float-x=”alternate” の指定によりを自動で調整できるようになりました。この指定により段組みの最初の段のときは end側、最後の段のときは start側、それ以外では center へ配置します。なお、段組みでないときは center へ配置されます。
axf:float-x / CSS -ah-float-x(オンラインマニュアル)

AH Formatter 組版例
– axf:float-x=”alternate” を指定した組版例 –

『AH Formatter』のサンプルページには、
本機能が確認できるサンプル「段組内フロートの自動配置の設定例(axf:float-x=”alternate”)」を掲載しております。

『AH Formatter』の評価版は次のページよりお申し込みいただけます。ご興味のある方は是非お試しください。
AH Formatter 評価版のお申し込み

弊社ではご検討中のお客様向けに技術相談会を行っております。お気軽にお問い合わせください。
アンテナハウス システム製品技術相談会

 


[書籍のご案内] XSL-FO の基礎 – XML を組版するためのレイアウト仕様

この度、弊社執筆による「XSL-FO の基礎」のプリントオンデマンド(POD)による紙版が発売になりました。

XSL-FO の基礎
目次の一覧は、こちらでご覧ください。

本書は、主として XSL-FOドキュメントを印刷するソフトである XSL-FOプロセサを利用する人に向けた解説書です。解説は、標準の仕様書(Extensible Stylesheet Language (XSL) Version 1.1)の範囲内ですので、アパッチの FOP などのオープンソース XSL-FOプロセサでも共通であり、『AH Formatter』のユーザでない方でも活用いただけます。

なお、本書は、弊社が開発しているクラウドで書籍を制作・編集し、そのデータから PDF と EPUB、Kindle といった様々な形式の書籍を一元的に作成できる Webサービス『CAS-UB』を利用して作成しました。『CAS-UB』では内部的に XHTML から XSL-FO を利用して PDF を生成しています。

本書は、Amazon.co.jp三省堂オンデマンド(「オンデマンド和書(その他出版社)」の項)などからご注文いただけます。

本著が皆様の XSL-FO 活用のお役に立つよう、心より願っております。

 


XSL-FOの便利な機能、参照エリアとインデントとはどんなもの?(2)

前回に引き続き、参照エリアとインデントについて説明します。

ブロック(段落)全体に対するインデントは段落ブロックに対するmargin-*で表すことができますが、start-indent, end-indentの方が便利です。

start-indent、end-indentは参照エリアの内容辺を基準にして、指定したFOの内容辺までの距離を指定します。

次の例では、本文区画(基本版面)の内容辺から、章の内容への間隔を20pt(2文字分)とり、引用段落を10pt(1文字)字下げ)、表は基本版面一杯に設定する例です。それぞれ、start-indent=”20pt”、start-indent=”30pt”、start-indent=”0pt”と指定します。

<fo:block start-indent=”20pt” text-indent=”1em”>
<fo:block font-size=”16pt”>第1章</fo:block>
<fo:block background-color=”#EAEAEA”>
<fo:block font-size=”14pt” space-before=”0.5em”>節1</fo:block>
<fo:block>章や節の見出しなどからページの柱(ランニングヘッダーやランニングフッター)を設定したり、辞書のページの辺に最初の単語と最後の単語を示したりできる。</fo:block>
<fo:block text-indent=”0em” background-color=”white” start-indent=”30pt” >どれもみんな肥料や薪炭をやりとりするさびしい家だ。街道のところどころにちらばって黒い小さいさびしい家だ。(宮沢 賢治『秋田街 道』)</fo:block>
</fo:block>
<fo:block background-color=”#DDDDDD”>
<fo:block font-size=”14pt” space-before=”0.5em”>節2</fo:block>
<fo:block>章や節の見出しなどからページの柱(ランニングヘッダーやランニングフッター)を設定したり、辞書のページの辺に最初 の単語と最後の単語を示したりできる。</fo:block>
<fo:table start-indent=”0pt” z-index=”2″ background-color=”yellow”>
<fo:table-column column-number=”1″ column-width=”proportional-column-width(1)”></fo:table-column>
<fo:table-column column-number=”2″ column-width=”proportional-column-width(2)+2pc”></fo:table-column>
<fo:table-column column-number=”3″ column-width=”72pt”></fo:table-column>
<fo:table-body>
<fo:table-row height=”20pt”>
<fo:table-cell column-number=”1″ display-align=”before”>
<fo:block>Cell 1 </fo:block>
</fo:table-cell>
<fo:table-cell column-number=”2″ display-align=”center” text-align=”center”>
<fo:block>Cell 2 </fo:block>
</fo:table-cell>
<fo:table-cell column-number=”3″ text-align=”center”>
<fo:block>Cell 3 </fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:block>
<fo:block background-color=”#EEEEEE” z-index=”0″>
<fo:block font-size=”14pt” space-before=”0.5em”>節3</fo:block>
<fo:block>章や節の見出しなどからページの柱(ランニングヘッダーやランニングフッター)を設定したり、辞書のページの辺に最初 の単語と最後の単語を示したりできる。同じエリアの中で同じ種類が指定されていたり、空のときはエラーである。</fo:block>
</fo:block>

本文区画は参照エリアであり、インデントの指定はすべて、本文区画の辺からの距離となります。その結果レイアウトは次のようになります。

start-indent-sample1

同じFOのstart-indentの箇所に、代わりにmargin-leftを指定すると、次のようになります。マージンは、親のブロックの内容辺を基準に自分のブロックのボーダーまでの距離になるため、内側に積み重なってしまうのです。

start-indent-sample2

このようにインデントは参照エリアを基準にして、FOのネストの如何に関わらず、指定されたFOの内容エリアまでの距離を指定します。

XSL-FOでもCSSでも、基本はブロック/エリアという玉ねぎの皮のような入れ子レイアウトモデルです。このため入れ子にならない字下げ配置の指定は厄介です。インデントを使うことで、その厄介な配置を簡単に指定できます。

『XSL-FOの基礎 – XML を組版するためのレイアウト仕様』(近日発売)


Pages: Prev 1 2 3 4 5 6 7 Next