XSLサブ・テンプレートの使用例
次に、XSLサブテンプレートを使用してレポートで実現可能な書式設定の例を示します。
HTML書式によるXMLデータの処理
すでにHTML書式が含まれるXMLデータがあり、その書式をレポートで維持する場合は、XSLサブテンプレートを使用してHTMLの書式設定コマンドをPublisherで処理可能なXSLの同等要素にマップすると、その書式を維持できます。
HTMLはXHTML書式で記述されている必要があります。つまり、データ内のすべてのHTMLタグに開始および終了タグが必要です。たとえば、データで改行に単純な<BR>
を使用している場合は、このソリューションを使用する前に終了タグの</BR>
を追加する必要があります。
次に、HTML書式設定のサンプル・データを示します。
<DATA>
<ROW>
<PROJECT_NAME>Project Management</PROJECT_NAME>
<PROJECT_SCOPE>
<p>Develop an application to produce <i>executive-level summaries</i> and detailed project reports. The application will allow users to: </p>
<p>Import existing MS Project files </p>
<p>Allow the user to map file-specific resources to a central database entities (i.e., people) and projects; </p>
<p>Provide structured output that can be viewed by staff and executives. </p>
</PROJECT_SCOPE>
<PROJECT_DEFINITION><b>Information about current projects is not readily available to executives.</b> Providing this information creates a reporting burden for IT staff, who may already maintain this information in Microsoft Project files. </PROJECT_DEFINITION>
</ROW>
</DATA>
次の図に示すように、これらのタグで指定された書式設定を保持してこれを表示することがレポートの要件だとします。
次のサブ・テンプレートは、XSL構文を使用してXMLデータ内の3つのHTMLタグを対応付けています。次にテンプレートで、対応するHTML文字列がXSLFOの同等要素に置換されます。
<xsl:template match="P|p">
<fo:block white-space-collapse="false" padding-bottom="3pt" linefeed-treatment="preserve">
<xsl:apply-templates select="text()|*|@*"/>
</fo:block>
</xsl:template>
<xsl:template match="STRONG|B|b">
<fo:inline font-weight="bold">
<xsl:apply-templates/>
</fo:inline>
</xsl:template>
<xsl:template match="EM|I|i">
<fo:inline font-style="italic">
<xsl:apply-templates/>
</fo:inline>
</xsl:template>
XSL構文を使用するには:
データの一部に対する書式設定の動的な適用
このサブ・テンプレートの使用例は、化学式、数値計算または上付きおよび下付き文字を必要とするドキュメントで役立ちます。
たとえば、次のXMLデータでは、CO2をCO2として表示し、H2OをH2Oとして表示することが予期されます。
<ROWSET>
<ROW>
<FORMULA>CO2</FORMULA>
</ROW>
<ROW>
<FORMULA>H2O</FORMULA>
</ROW>
</ROWSET>
これはXSLサブ・テンプレートを使用することによって実現可能です。XSL構文を使用することで、任意の名前のテンプレートを定義できます。たとえば、chemical_formatterは、FORMULAフィールドをパラメータとして取得し、文字を1つずつ読み取ります。これは、文字を0 - 9の数字と比較し、一致がある場合は次のXSL FO構文を使用して下付き文字にします。
<fo:inline baseline-shift="sub" font-size="75%">
XSLテンプレート文のサンプル・コードは次のとおりです。
<xsl:template name="chemical_formatter">
<! - accepts a parameter e.g. H2O - >
<xsl:param name="formula"/>
<! - Takes the first character of the string and tests it to see if it is a number between 0-9 - > <xsl:variable name="each_char"
select="substring($formula,1,1)"/>
<xsl:choose>
<xsl:when test="$each_char='1' or $each_char='2'
or $each_char='3' or $each_char='4' or $each_char='5'
or $each_char='6' or $each_char='7' or $each_char='8'
or $each_char='9' or $each_char='0'">
<! - if it is numeric it sets the FO subscripting properties - >
<fo:inline baseline-shift="sub" font-size="75%">
<xsl:value-of select="$each_char"/>
</fo:inline>
</xsl:when>
<xsl:otherwise>
<! - otherwise the charater is left as is - >
<fo:inline baseline-shift="normal">
<xsl:value-of select="$each_char"/>
</fo:inline>
</xsl:otherwise>
</xsl:choose>
<! - test if there are other chars in the string, if so the recall the template - >
<xsl:if test="substring-after($formula,$each_char) !=''">
<xsl:call-template name="chemical_formater">
<xsl:with-param name="formula">
<xsl:value-of select="substring-after($formula,$each_char)"/>
</xsl:with-param>
</xsl:call-template>
</xsl:if>
</xsl:template>
これは、書式設定テンプレートとH2OのFORMULA値をコールします。レンダリングを実行すると、式が予期どおりにH2Oと表示されます。