ヘッダーをスキップ
Oracle Fusion Middleware Oracle Business Intelligence Publisherレポート・デザイナーズ・ガイド
11gリリース1 (11.1.1)
B63038-05
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

14 XSLサブ・テンプレートの設計

この章では、XSLサブ・テンプレートの作成方法、およびRTFテンプレート用の再利用可能な拡張機能の作成方法について説明します。

この章の内容は次のとおりです。

14.1 XSLサブ・テンプレートの理解

XSLサブ・テンプレートは、1つ以上の<xsl:template>定義で構成されたXSLファイルであり、各定義には書式設定または処理コマンドのブロックが含まれています。カタログ内のサブ・テンプレート・オブジェクトとしてBI Publisherにアップロードすると、このXSLファイルを別のRTFテンプレートからコールして書式設定または処理コマンドを実行できます。

XSLサブ・テンプレートは、データやレイアウトの複雑な要件に対処できます。XSLサブ・テンプレートを使用して、レポートの特定のセクション(たとえばチャート)のデータ構造を変換したり、複雑なレイアウトを管理するスタイルシートを作成します。

14.1.1 RTFメイン・テンプレート内でXSLコードを配置する位置

XSLサブ・テンプレートをメインRTFサブ・テンプレート内からコールするときは、XSLコマンドを使用します。このコードは、BI Publisherフィールド内に入力します(またはMicrosoft Wordフォーム・フィールド内)。XSLコードは直接RTFテンプレートの本文に入力できません。

RTFテンプレートでのフォーム・フィールドの挿入の詳細は、第5.4.1項「フィールドの挿入」を参照してください。

14.2 XSLサブ・テンプレートの作成と実装処理の概要

XSLサブ・テンプレートの作成および実装手順は次のとおりです。

  1. 他のテンプレート内に含める、共通コンポーネントまたは処理命令が含まれるXSLファイルを作成します。

    XSLサブ・テンプレートは、1つ以上のXSLテンプレート定義で構成されます。これらのテンプレートには、指定したノードに一致したときに適用するルールを含めます。

  2. コールまたはメインのレイアウトを作成し、メイン・テンプレートにサブ・テンプレートをインポートするコマンドおよびXSLサブ・テンプレートを適切なデータ要素に適用するコマンドをインクルードします。

  3. メイン・テンプレートをレポート定義にアップロードし、カタログ内にサブ・テンプレートを作成します。

14.3 XSLサブ・テンプレート・ファイルの作成

.xsl形式でファイルを保存できるエディタに命令を入力します。XSLサブ・テンプレートは、1つ以上のXSLテンプレート定義で構成されます。これらのテンプレートには、指定したノードに一致したときに適用するルールを含めます。

サブ・テンプレート定義の構造は次のとおりです。

<xsl:template
  name="name" 
  match="pattern" 
  mode="mode" 
  priority="number">
<!--Content:(<xsl:param>*,template) -->
</xsl:template>

表14-1はテンプレート宣言のコンポーネントを説明しています。

表14-1 テンプレート宣言のコンポーネント

コンポーネント 説明

xsl:template

xsl:template要素は、必要な出力表示を生成するノードに適用するテンプレートを定義するために使用します。

name="name"

オプションです。テンプレートの名前を指定します。

メモ: この属性を省略した場合は、match属性が必須になります。

match="pattern"

オプションです。テンプレートの一致パターンです。

メモ: この属性を省略した場合は、name属性が必須になります。

priority="number"

オプションです。テンプレートの数値の優先度を示す数値です。ノードには、複数のテンプレートを適用できます。常に優先度の値が最も高いテンプレートが選択されます。この値の範囲は、-9.0から9.0までです。


例:

<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>

14.4 メイン・テンプレートからのXSLサブ・テンプレートのコール

サブ・テンプレートをメイン・テンプレートに実装するには、メイン・テンプレートに2つのエントリを作成します。

最初に、メイン・テンプレートにサブ・テンプレートをインポートします。インポートの構文で、カタログ内のサブ・テンプレートを検出するBI Publisherエンジンを指定します。

次に、サブ・テンプレートの内容をレンダリングするコール・コマンドを必要な位置に入力します。

14.4.1 サブ・テンプレートのインポート

メイン・テンプレート内のコール・テンプレート・コマンドより前の任意の位置に次のインポート・コマンドを入力します。

<?import:xdoxsl:///{path to subtemplate.xsb}?>

説明:

path to subtemplate.xsbは、カタログ内のサブ・テンプレート.xsbオブジェクトへのパスです。

たとえば、次のように入力します。

<?import:xdoxsl:///Executive/Financial Reports/mySubtemplate.xsb?>

14.4.2 サブ・テンプレートのコール

XSLサブ・テンプレート・ファイル内で定義されたテンプレート文はデータ要素に適用されます。インポートしたXSLサブ・テンプレート内のテンプレート定義は、2種類の方法でコールできます。

  • データの内容を一致基準と照合します。

    <xsl:apply-templates select="data_element"/>
    

    このメソッドでは、XSLサブ・テンプレートで定義されたすべてのテンプレートが、指定されたdata_elementに適用されます。data_elementのデータの内容に従って、それらのテンプレートの適切な機能が適用されます。詳細な例は、第14.6.1項「HTML書式によるXMLデータの処理」に示すユースケースを参照してください。

  • テンプレートを名前でコールします。

    <xsl:call-template name="templateName"/>
    

    このメソッドでは、テンプレートが名前でコールされ、テンプレートが関数コールと同様に実行されます。また、RTFサブ・テンプレートと同様にテンプレート・コールにパラメータを渡すことができます。次の第14.4.3項「XSLサブ・テンプレートへのパラメータの引渡し」を参照してください。

    詳細な例は、第14.6.2項「データの一部に対する書式設定の動的な適用」に示すユースケースを参照してください。

14.4.3 XSLサブ・テンプレートへのパラメータの引渡し

XSLサブ・テンプレートにパラメータを渡す手順は次のとおりです。

  1. 次のように、<xsl:template>定義内でパラメータを宣言します。

    <xsl:template name="templateName" match="/">
       <xsl:param name="name" />
    </xsl:template>
    
  2. このテンプレートを次の構文を使用してコールします。

    <xsl:call-template name="templateName">
      <xsl:with-param name="name" select="expression">
        <?--- Content:template -->
      </xsl:with-param>
    </xsl:call-template>
    

14.5 カタログでのサブ・テンプレート・オブジェクトの作成

サブ・テンプレート・ファイルをアップロードする手順は次のとおりです。

  1. グローバル・ヘッダーで、「新規」をクリックし、「サブ・テンプレート」をクリックします。サブ・テンプレートページが表示されます。

  2. テンプレート」リージョンで、「アップロード」をクリックし、「テンプレート・ファイルのアップロード」ダイアログを起動します。

  3. サブ・テンプレート・ファイルの位置を探して選択します。

    • タイプ: XSLサブ・テンプレート・ファイルのxslを選択します。

    • ロケール: サブ・テンプレート・ファイルの該当するロケールを選択します。

  4. 「アップロード」をクリックします。

    サブ・テンプレート・ファイルが、「テンプレート」リージョンに、選択したロケール名で表示されます(例: en_US)。

  5. 「保存」をクリックします。「別名保存」ダイアログで、サブ・テンプレートを保存するカタログ・フォルダを選択します。「名前」に名前を入力し、「保存」をクリックします。図14-1は、My Subtemplateと命名されたサブ・テンプレートを示しています。

    図14-1 サブ・テンプレート

    図14-1の説明が続きます
    「図14-1 サブ・テンプレート」の説明

サブ・テンプレート・オブジェクトは、拡張子.xsbで保存されます。レポートにサブ・テンプレートをインポートするときは、ここで指定した名前に.xsbが付加されたものを使用します(例: MySubtemplate.xsb)。

XSLサブ・テンプレートでは、翻訳はサポートされていません。

14.6 XSLサブ・テンプレートの使用例

次に、XSLサブ・テンプレートを使用してレポートで実現可能な書式設定の例を示します。

14.6.1 HTML書式によるXMLデータの処理

すでにHTML書式設定を含んだXMLデータがあり、その書式設定をレポートで維持する場合は、XSLサブ・テンプレートを使用してHTMLの書式設定コマンドをBI 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>

このサンプルで使用されているHTMLタグは次のとおりです。

  • <p> - 段落タグ

  • <i> - 斜体タグ

  • <b> - 太字タグ

図14-2に示すように、これらのタグで指定された書式設定を保持してこれを表示することがレポートの要件だとします。

図14-2 サンプルのHTMLファイル

図14-2の説明が続きます
「図14-2 サンプルのHTMLファイル」の説明

次のサブ・テンプレートは、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構文を使用する手順は次のとおりです。

  1. このXSLサブ・テンプレート・ファイルをBI Publisherカタログの場所である、Shared Folders/Projectsにアップロードします。このサブ・テンプレート・ファイルをhtmlmarkup.xsbの名前で保存します。

  2. メイン・テンプレートで、サブ・テンプレート・ファイルをインポートする次の文を入力します。

    <?import:xdoxsl:///Projects/htmlmarkup.xsb?>
    
  3. HTMLマークアップを含むフィールドごとに、xsl apply-templateコマンドをコールします。この例では、2つのフィールドがあります。

    <xsl:apply-templates select="PROJECT_SCOPE"/>
    <xsl:apply-templates select="PROJECT_DEFINITION"/>
           
    

    図14-3は、テンプレート内のフィールド定義を示しています。

    図14-3 フィールド定義

    図14-3の説明が続きます
    「図14-3 フィールド定義」の説明

    このコマンドは、PROJECT_SCOPEおよびPROJECT_DEFINITION要素の値をすべてのテンプレートに適用するようにプロセッサに命令します。次に、サブ・テンプレートの関数を循環実行して、一致を検索します。

14.6.2 データの一部に対する書式設定の動的な適用

このサブ・テンプレートの使用例は、化学式、数値計算または上付きおよび下付き文字を必要とするドキュメントで役立ちます。

たとえば、次の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>

このXSLテンプレート文を使用する手順は次のとおりです。

  1. このファイルをchemical.xslの名前で保存します。

  2. 第12.4項「カタログでのサブ・テンプレート・オブジェクトの作成」の手順に従います。サブ・テンプレートの名前をChemicalとし(Chemical.xsbの名前で保存されます)、Shared Folders/Subtemplatesの場所に保存します。

  3. メインRTFテンプレートで、インポート構文を入力します。

    <?import:xdoxsl:///Subtemplates/Chemical.xsb?>
    
  4. レポートでXSLコードをレンダリングするには、データのループを作成し、VALUEフィールドで次の文を使用します。

    <xsl:call-template name="chemical_formatter">
    <xsl:with-param name="formula" select="VALUE"/> </xsl:call-template>
    

これは、書式設定テンプレートとH2OのFORMULA値をコールします。レンダリングを実行すると、式が予期どおりにH2Oと表示されます。