0

XSL-FO と Antenna House Formatter v6.3 を使用して、フライト マニュアルのレイアウトに取り組んでいます。

多くの情報は、「条件 X がこれとあれを行う場合、それ以外の場合は別のことを行う」というタイプのものです。現在のケースでは、次の XML があります。

<crewDrill>
    <case>
        <caseCond>Hot inside:</caseCond>
        <if>
            <caseCond>Yes</caseCond>
            <crewDrillStep>
                <para>Adjust thermostat</para>
            </crewDrillStep>
            <crewDrillStep>
                <para>Open the window</para>
            </crewDrillStep>
        </if>
    </case>
    <crewDrillStep>
        <para>Enjoy life</para>
    </crewDrillStep>
</crewDrill>

この XML の望ましい出力は次のようになります。

条件ステートメントの望ましい出力

編集:私の懸念は、XSLTを使用してXMLをXSL-FO(アンテナハウスフォーマッターの機能を含む)に変換することで目的の出力が実現可能かどうかです。そうであれば、問題にアプローチする適切な方法は何でしょうか? XSL-FO についての知識があれば、これを行う唯一の方法は、テーブルを使用することです。おそらくもっと良い方法があります。

編集 2: @Tomalak が指摘しているように、XSL-FO 構造がどのように見えるか、および XSLT 変換がどのように見えるかという 2 つの質問があります。私の主な関心事は、目的の出力を表す XSL-FO 構造がどのように見えるかということです。ターゲット構造が与えられれば、おそらく変換を理解できるでしょう。不明確な最初の質問で申し訳ありません。私の懸念を明確にしてくれた @Tomalak に感謝します。

使用される XML スキーマは、S1000D 4.1 Crew スキーマに由来します

4

1 に答える 1

1

ここに、考察のための XSL コードをいくつか示します。完璧ではありませんが、テーブルの境界線と列を微調整すると、そこに到達できる可能性があります。

注: さまざまなケースをテストできるように、単一のドキュメント要素を追加しました。

この XSL:

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
        xmlns:fo="http://www.w3.org/1999/XSL/Format"
        version="1.0">
        <xsl:template match="/">
            <xsl:apply-templates/>
        </xsl:template>
        <xsl:template match="document">
            <fo:root font-family="Arial">
                <fo:layout-master-set>
                    <fo:simple-page-master master-name="page"
                        page-height="11in" page-width="8in"
                        margin-top=".5in" margin-left="1in" margin-right="1in" margin-bottom=".5in">
                        <fo:region-body/>
                    </fo:simple-page-master>
                </fo:layout-master-set>
                <fo:page-sequence master-reference="page">
                    <fo:flow flow-name="xsl-region-body" >
                        <xsl:apply-templates/>
                    </fo:flow>
                </fo:page-sequence>
            </fo:root>
        </xsl:template>
        <xsl:template match="crewdrill">
            <!-- whole diagram, put into a block -->
            <fo:block>
                <xsl:apply-templates/>
            </fo:block>
        </xsl:template>
        <xsl:template match="case">
            <!-- map to a table 2-row table, one for heading and one for the step(s) -->
            <fo:table>
                <fo:table-column column-width="12pt"/>
                <fo:table-column column-width="12pt"/>
                <fo:table-column column-width="12pt"/>
                <fo:table-column/>
                <fo:table-column column-width="prrportional-column-width(100)"/>
                <fo:table-body>
                    <fo:table-row>
                        <fo:table-cell number-columns-spanned="6">
                            <fo:block font-weight="bold">
                                <xsl:value-of select="caseCond"/>
                            </fo:block>
                        </fo:table-cell>
                    </fo:table-row>
                    <xsl:apply-templates/>
                </fo:table-body>
            </fo:table>
        </xsl:template>
        <xsl:template match="if">
            <fo:table-row>
                <fo:table-cell border-right="0.5pt solid black">
                    <fo:block text-align="right" margin-right="-1.5pt">◄&lt;/fo:block>
                </fo:table-cell>
                <fo:table-cell padding-left="-1.5pt">
                    <fo:block>►&lt;/fo:block>
                </fo:table-cell>
                <fo:table-cell>
                    <fo:block>─</fo:block>
                </fo:table-cell>
                <fo:table-cell border="0.5pt solid black" text-align="center">
                    <fo:block font-weight="bold">
                        <xsl:value-of select="caseCond"/>
                    </fo:block>
                </fo:table-cell>
                <fo:table-cell>
                    <fo:block><fo:leader/></fo:block>
                </fo:table-cell>
            </fo:table-row>
            <fo:table-row>
                <fo:table-cell border-right="0.5pt solid black">
                    <fo:block><fo:leader/></fo:block>
                </fo:table-cell>
                <fo:table-cell>
                    <fo:block><fo:leader/></fo:block>
                </fo:table-cell>
                <fo:table-cell>
                    <fo:block><fo:leader/></fo:block>
                </fo:table-cell>
                <fo:table-cell number-columns-spanned="2">
                    <xsl:apply-templates/>
                </fo:table-cell>
            </fo:table-row>
            <fo:table-row>
                <fo:table-cell border-right="0.5pt solid black">
                    <fo:block><fo:leader/></fo:block>
                </fo:table-cell>
                <fo:table-cell font-weight="bold" text-align="center" number-columns-spanned="4">
                    <fo:block>- END -</fo:block>
                </fo:table-cell>
            </fo:table-row>
        </xsl:template>
        <xsl:template match="crewDrillStep[not(parent::if)]">
            <xsl:variable name="num">
                <xsl:value-of select="count(preceding-sibling::crewDrillStep) + 1"/>
            </xsl:variable>
            <fo:table>
                <fo:table-body>
                    <fo:table-row>
                        <fo:table-cell border="0.5pt solid black" text-align="center">
                            <fo:block font-weight="bold">No</fo:block>
                        </fo:table-cell>
                        <fo:table-cell>
                            <fo:block><fo:leader></fo:leader></fo:block>
                        </fo:table-cell>
                    </fo:table-row>
                    <fo:table-row>
                        <fo:table-cell number-columns-spanned="2">
                            <xsl:apply-templates>
                                <xsl:with-param name="num" select="$num"/>
                            </xsl:apply-templates>
                        </fo:table-cell>
                    </fo:table-row>
                    <fo:table-row>
                        <fo:table-cell font-weight="bold" text-align="center" number-columns-spanned="5">
                            <fo:block>------ END ------</fo:block>
                        </fo:table-cell>
                    </fo:table-row>
                </fo:table-body>
            </fo:table>
        </xsl:template>
        <xsl:template match="crewDrillStep">
            <xsl:variable name="num">
                <xsl:value-of select="count(preceding-sibling::crewDrillStep) + 1"/>
            </xsl:variable>
            <xsl:apply-templates>
                <xsl:with-param name="num" select="$num"/>
            </xsl:apply-templates>
        </xsl:template>
        <xsl:template match="para">
            <xsl:param name="num"/>
            <fo:block>
                <xsl:text>(</xsl:text><xsl:value-of select="$num"/><xsl:text>) </xsl:text><xsl:value-of select="."/>
            </fo:block>
        </xsl:template>
        <xsl:template match="caseCond"/>
    </xsl:stylesheet>

次の出力が得られます。

ここに画像の説明を入力

于 2016-11-25T23:26:19.117 に答える