ステップ1: Generating Paged Media Aware Navigation on XForms Document

印刷メディア上で文書を表現する際には, ユーザのナビゲーションに課題がある. 通常,印刷メディア上での文書は, コンテンツの構造化を行うこと,構造に序数を付与することで, ユーザのナビゲーションを支援しようとする. たとえば,「章」という構造を作成したり, メディアにもともと備わっている「ページ」という構造を利用して, そこに番号を付与する. こうした方法により, 「ページ番号」の引用による目次・索引・本文中でのナビゲーション, 「章見出し」の引用による目次・本文中でのナビゲーションなどが行われる.

こうした印刷メディア上での文書が,アンケート調査を目的とした 調査票である場合には,「ページ番号」「章見出し」よりも, さらに細粒度のナビゲーション機能が必要となる.たとえば:

このステップでは,印刷メディア特有の概念である「ページ番号」は後回しとし, 他メディアでも一般的に必要であると言える「番号つき章見出し」「設問番号」を 付与する処理を行う.

cmpl-label.xsl

XForms1.0のフォームコントロール要素にはxforms:label要素が 必須であるが,SQSではラベルを単純な通し番号 として割り振る形をデフォルトとするので, このxforms:label要素の記述を省略できるものとする.

すなわち,このxslスクリプトは, XForms1.0のフォームコントロール要素 (xforms:input, xforms:textarea, xforms:select, xforms:select1)に xforms:label要素が存在しない場合に, <xforms:label><sqs:counter/></xforms:label> を挿入する機能を持つ.xforms:label要素が存在する場合には, そのフォームコントロール要素については何もしない.

なお,後述のembd-link.xslにより,xforms:labelの内容を相互参照をしたい場合には, <xforms:label sqs:id="ほげほげ"><sqs:counter/></xforms:label> というように,xforms:label要素を省略せずに書き,sqs:id属性の指定をすること. なお,このように,xforms:label要素を省略して書いた部分と省略せずに書いた部分とが混在しても, cmpl-label.xsl,embd-link.xslの動作に支障はない.

cmpl-ref.xsl

XForms1.0のフォームコントロールにはref属性が必須であるが, SQSでは単純な通し番号をもとに自動生成したXPath式を 付与することにする. このとき,XPathが指し示すXForms Modelは, 設問の意味構造を反映するものではないことに注意 (意味構造は,別途にフォームコントロールなどから 生成されるRDFで付与する予定).

ref属性の値として自動生成されるXPath
フォームのパターンXPathXPathの例
input, textarea, select1a[設問通し番号]a[12]
selecta[設問通し番号]/v値a[23]/v2
matrix-forms > (input, textarea, select1)a[設問通し番号]/r[設問内行番号]/c[設問内列番号]a[33]/r[4]/c[2]
matrix-forms > selecta[設問通し番号]/r[設問内行番号]/c[設問内列番号]/v値a[38]/r[5]/c[3]/v1

embed-counter.xsl

XHTML2.0/XForms1.0文書に加えられたSQS要素を, 文書構造に応じた「通し番号」の文字列表現に置き換える機能を 持つスタイルシート.

XSLでは,XSL-FO仕様にはない機能・FOプロセッサで未実装な機能は, XSLTなどを用いたプリプロセスで,直接的に文字列表現や表現構造を 生成してやる必要がある.その一例として,ここでは, CSSのcontentプロパティを用いた機能を模したものを 便宜的に提供するためのXSLTを提供する.

このスタイルシートは,cmpl-label.xslスタイルシートの後, embed-link.xslスタイルシートの前に使うことを意図している.

要素属性最小内容モデル説明
xhtml:h sqs:prefix(CDATA),
sqs:format(CDATA),
sqs:suffix(CDATA)
PCDATA 文書の中で,xhtml:sectionについての通し番号nを得て, 「<prefix><n><suffix><内容モデル>」という表記を作る.
sqs:counter sqs:prefix(CDATA),
sqs:format(CDATA),
sqs:suffix(CDATA)
EMPTY 文書の中で,FormControls についての通し番号nを得て,「<prefix><n><suffix>」という表記を作る.
XSLTパラメータ名デフォルト値
xhtml.h-attribute..sqs.prefixCDATA
xhtml.h-attribute..sqs.formatCDATA1
xhtml.h-attribute..sqs.suffixCDATA.
sqs.counter-attribute..sqs.prefixCDATA(
sqs.counter-attribute..sqs.formatCDATA1
sqs.counter-attribute..sqs.suffixCDATA)

embed-link.xsl

SQS要素を置き換えて,相互参照関係を作成する機能を持つスタイルシート.

このスタイルシートは,LaTeXにおける\labelと\refに対応して, sqs:id属性と,sqs:ref/@sqs:idref による相互参照を実現する. 参照先の内容が参照元に埋め込まれることになる. そのため,このスタイルシートを使う前に, embed-counter.xslなどの内容埋め込み系のスタイルシートを 実行しておくといったように,使う順番に注意する必要がある.

要素属性最小内容モデル説明
*sqs:id*(ID) PCDATA この要素の内容を参照用に登録する
sqs:refsqs:idref*(IDREFS) EMPTY sqs:labelで登録しておいた参照内容を表示する

ステップ2: Table Layout of XForms Contents

pxformsConvert1.xsl

XForms1.0の要素のうち,label, hint, help, alart 要素を, 視覚的に区別できるような形で表記するために, XHTML2.0のtableを用いることで, それぞれの要素をレイアウトする機能を持つスタイルシート.

変換後には,xforms:label要素の内容などを, xformsフォームコントロールの外側に抽出して,表記することを行う (XML文書としては冗長な内容になる).

要素属性最小内容モデル説明
sqs:pageset PCDATA まとめて表示すべきページをグループ化(このタグの境界で改ページが起こる)
要素属性最小内容モデル説明
xhtml:divclass("warning") PCDATA 記入上の注意など,回答者への伝達事項を指定(枠線で囲まれたテキストブロック表示)
xhtml:strong PCDATA 強調表示(太字)
xhtml:spanclass("underline" | "bold"| "small") PCDATA underlineでアンダーライン表示,boldで太字表示,smallで小さなフォントで表示
要素属性最小内容モデル説明
xforms:labelPCDATA 設問を表す短い名前(ex.設問の通し番号).SQSの利用においては, cmpl-label.xslによって補完される部分なので,ユーザが直接に 入力する必要はあまりない.
xforms:hint sqs:prefix(CDATA), sqs:display("inline" | "none"), sqs:suffix(CDATA) PCDATA 回答者のための質問文
xforms:help sqs:prefix(CDATA), sqs:display("inline" | "none"), sqs:suffix(CDATA) PCDATA 回答者のための補助的な情報. 「〜すべし」の提示(複数選択か,単一選択かetc.)
xforms:alart sqs:prefix(CDATA), sqs:display("inline" | "none"), sqs:suffix(CDATA) PCDATA 回答者のための注意事項. 「〜べからず」の提示(回答がinvalidにならないための注意)
XSLTパラメータ名デフォルト値
xforms.hint-attribute..sqs.prefixCDATA
xforms.hint-attribute..sqs.display("inline" | "none")inline
xforms.hint-attribute..sqs.suffixCDATA
xforms.help-attribute..sqs.prefixCDATA
xforms.help-attribute..sqs.display("inline" | "none")inline
xforms.help-attribute..sqs.suffixCDATA
xforms.alart-attribute..sqs.prefixCDATA
xforms.alart-attribute..sqs.display("inline" | "none")inline
xforms.alart-attribute..sqs.suffixCDATA

自由記述欄

要素属性最小内容モデル説明
xforms:input | xforms:textareaxforms:ref(XPathExpression),
sqs:width(Number), sqs:height(Number), sqs:prefix(CDATA), sqs:suffix(CDATA)
UI Common 自由記述欄.widthとheightで紙面上でのサイズをpxで指定,
prefixとsuffixで自由記述欄の前後にCDATAを表示

選択肢欄

要素属性最小内容モデル説明
xforms:select | xforms:select1xforms:ref(XPathExpression),
sqs:cols(Number)
UI Common, (xforms:item)* 単一選択肢または複数選択肢.
colsにより選択肢欄の紙面上での表示カラム数を指定
xforms:itemsqs:colspan(Number), sqs:input(Boolean) xforms:label, xforms:value 選択肢.
colspanにより選択肢の紙面上での占有カラム数を指定.
input="true"のとき, 選択肢を自由記述欄として読み取り(「その他」など)

範囲内数値指示欄

要素属性最小内容モデル説明
xforms:rangexforms:start*(Number),xforms:end*(Number),
xforms:step*(Number),
sqs:width*(Number),
sqs:tick*(Number)
UI Common, (xforms:indicator)* startでフォームの開始値, endでフォームの終端値,
stepでフォームの間隔,
widthでフォーム要素の表示領域の横幅,
tickで目盛の間隔
sqs:indicatorsqs:value*(Number) PCDATA valueで目盛の値, 内容で目盛のラベル

マトリクス型回答欄

XFormsへの拡張として, 複数の設問ラベルと,複数のXForms1.0要素を表形式でレイアウトする ためのsqs:matrixforms要素に対応する.

sqs:matrix-forms要素内での回答の値は, "表ref/行ref/列ref"の形式のXPathに バインドされる.

要素属性最小内容モデル説明
sqs:matrix-formsxforms:ref(XPathExpression)xforms:label*, sqs:row-array, sqs:column-array 質問を表形式でレイアウトする部分のルート要素.
レイアウトされた全体についてのラベル等を付与することができる.
sqs:row-array(xforms:group)* 質問を表形式でレイアウトするときの行要素. フォームコントロールを行方向に配置する要素.
フォームコントロールの行グループにラベル等を付与することができる.
行要素であるxforms:group要素を子に持つ.
sqs:column-array(xforms:label|UI Common)* フォームコントロールを列方向に配置する要素.
フォームコントロールの列グループにラベル等を付与することができる. 列要素であるフォームコントロール要素を子に持つ.

ステップ3: Generating Form Documents for Specific Media

入力されるTable Layouted XForms Documentには, メディア非依存な表現サイズ指定のための, sqs:width, sqs:height, sqs:cols, sqs:colspan属性が 指定されているものとする.

HtmlForm.xsl

一般に普及しているWebブラウザでフォームに回答できるようなXHTML1.0を変換生成する. XHTML2.0要素のうち互換性のある要素は同じlocalnameのままXHTML1.0要素に置換する. 互換性のない要素は,対応するXHTLM1.0要素に置換する. また,XForms1.0のうち具体的なフォームコントロール要素は, XHTML1.0のform要素セットに変換される.

PXForms.xsl

PXForms.xslは,XForms1.0 のフォームコントロール要素を,印刷メディア対応のXForms1.0サブセット 仕様である PXForms に変換する機能を持つスタイルシートである.

PXForms とは Print Media Aware XForms の略である. PXFormsは,各種のXFormsフォームコントロール要素を, XFormsのサブセットに xforms:metadata要素を追加することで拡張したものとして定義される. Print Media Aware XFormsに変換後のxforms:metadata には, 変換前のxforms構造が保持される.


ステップ4: Rendering Form Documents on Specific Media

PXFormsToFO.xsl

SQSソースファイルを入力として,中間的に XHTML2.0 / Print Media Aware XForms を生成し,さらに FOX + XSL-FOに変換し,最終的なPDFを出力するためのスタイルシート. 出力内には,設問と解答欄が混載された調査票原稿として表現される. また,スキャン画像からマークを認識するためのメタデータが, PDFしおりとして付与される.

SVGにより,解答欄にはマーク欄が, ページ上下にはスキャン時に位置合わせをするための 基準マークが表現される.

PXFormsToHTML.xsl

SQSソースファイルを入力として, PXFormsToFO.xslの出力結果の見た目をブラウザ上でプレビューするための XHTML1.0を出力するスタイルシート.

HtmlForm.xsl

SQSソースファイルを入力として, ブラウザ上のFormとして回答を記入するための XHTML1.0を出力するスタイルシート.


凡例

EMPTY 空要素
PCDATA Parsed Charactor Data
CDATA Charactor Data
ID ID
IDREFS IDREFS
Boolean 真偽値("true" | "false")
Number 数値
XPathExpression XPath表現
UI Common xforms:hint | xforms:help | xforms:alart