Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

Zen レポートのページのフォーマット

前章の “Zen レポートのデータの収集” では、Zen レポートの基盤となる XML データの生成と編成の方法を説明しました。この章では、このデータを表示する仕様の記述方法について説明します。この仕様は、Zen レポート・クラスの XData ReportDisplay ブロック 1 つで構成されます。

ほとんどの場合、XData ReportDisplay ブロックのスタイルは出力形式と無関係です。ブラウザの URI 文字列またはターミナルのコマンド行で、レポート・クラスの形式を指定できます。レポートを起動して出力形式を指定する方法の詳細は、“Zen レポートの実行” の章を参照してください。

この章は、以下のトピックで構成されています。

XData ReportDisplay

XData ReportDisplay ブロックには 1 つの <report> 要素が含まれており、<report> にはレポートの表示を定義する追加の要素が含まれています。HTMLSTYLESHEET クラス・パラメータおよび XSLFOSTYLESHEET クラス・パラメータに有効な値を指定した場合は、XData ReportDisplay ブロック全体を省略できます。詳細は、“Zen レポート・クラスのパラメータ” のセクションを参照してください。XData ReportDisplay ブロックとパラメータ値の両方を指定した場合は、パラメータ値が優先します。

XML データ・ファイルの生成のみが目的で Zen レポート・クラスを使用する場合は、XData ReportDisplay を省略できます。

XData ReportDisplay ブロックを記述するには、XPath 式を理解する必要があります。XPath の多数の書籍やユーザ・ガイドが、Web サイトや一般書店から入手可能です。

XPath 式によるデータの検索

XData ReportDisplay ブロックの要素で、ページにおけるデータのフォーマット方法を指定します。表示要素では XPath 式を使用して、フォーマット対象データを識別します。以下の図では、XML データ・ソースを右側に、データのアクセスに必要な XPath 式を左側に示しています。この図の XML は、SAMPLES データベースにある ZenApp.MyReport のXData ReportDefinition ブロックにより生成されるものです。$MODE を使用して XML に設定された出力モードでレポートを実行した場合の XML 出力がわかります。Caché データベースのデータから XML を生成する方法の詳細は、“Zen レポートのデータの収集” の章を参照してください。

この例では、利用可能な XPATH 式の小さいサブセットを使用します。ここで使用する XPath 構文は以下になります。

  • /nodenamenodename という名前のルート要素を選択します。

  • /nodename/subnodesubnode という名前の nodename の子要素をすべて選択します。

  • /nodename/subnode/@attrnameattrname という名前の /nodename/subnode/ の属性をすべて選択します。

XML のノードを選択する XPath 式
generated description: xpath report display

次の図では引き続き例として、XData ReportDisplay ブロックで XPath 式を使用し XML からデータを取得してレポートにフォーマットする様子を示しています。ここで示されているコードは、SAMPLES データベースの ZenApp.MyReport からのもので、簡略になるように編集されています。図の後に詳しい説明があります。

XData ReportDisplay 構文における暗黙の XPath 式
generated description: xdata report display
  • 最上位レベルの <report> 要素の name 属性は、レポートにある他のすべての XPath 式のルート・ノードになります。この例では、属性の値は以下になります。

    myReport

    レポートにおけるその他すべての XPath 式は、このルート・ノードのコンテキストで評価されます。

  • <body> 内では、最初の <table> に <item> 要素があります。その field 属性では、第 2 レベルのノードの名前を属性の XPath 構文で指定しています。以下はその例です。

    @month

    ルート・ノードのコンテキストで評価され、ここでの有効な式は以下になります。

    /myReport/@month

    これによって、XML において <myReport> の month 属性のデータ値を特定します。

  • <group> 要素によって、階層のレベルを追加しています。その name 属性では、その <group> 内にあるすべての XPath 式用に第 2 レベルのノードの名前を指定しています。値は以下のとおりです。

    SalesRep

    ルート・ノードのコンテキストで評価され、有効な式は以下になります。

    /myReport/SalesRep

    これにより、<myReport> の子である <SalesRep> 要素のすべてが特定されます。<SalesRep> は、属性および要素のコンテナです。

  • <group> コンテナ内部にある最初の <table> では、いくつかの <item> 要素があります。

    • 最初の <item> 要素には、属性を特定する field 属性値があります。

      @name

      ルートとグループ・ノードのコンテキストで評価され、有効な式は以下になります。

      /myReport/SalesRep/@name

      これにより、<myReport> の子である <SalesRep> の name 属性のデータ値を特定できます。

    • 次の 2 つの <item> 要素には、要素を特定する field 属性値があります。例えば、以下のようになります。

      count

      ルートとグループ・ノードのコンテキストで評価され、有効な式は以下になります。

      /myReport/SalesRep/count

      これにより、<myReport> の子である <SalesRep> の子要素 <count> のデータ値を特定できます。

  • <group> コンテナ内部にある 2 番目の <table> には、XML のノードを識別する group 属性があります。値 :

    record

    ルート・ノードとグループのコンテキストで評価され、有効な式は以下になります。

    /myReport/SalesRep/record

    これにより、<SalesRep> の子である <record> 要素のすべてが特定されます。<record> は、属性および要素のコンテナです。このテーブルの項目には、属性と要素を <record> コンテナで特定する field 属性があります。これらは、この点で確立されたフル・コンテキストで評価され、以下のような有効な XPath 式になります。

    /myReport/SalesRep/record/date

  • 最後の <table> は、要素を終了する </group> の後にあるので <group> には含まれていません。この <table> には <item> 要素があり、その field 属性では以下のノード名を指定しています。

    grandTotal

    ルート・ノードのコンテキストで評価され、有効な式は以下になります。

    /myReport/grandTotal

    これにより、<myReport> の子である <grandTotal> 要素のデータ値を特定できます。

id 属性

XData ReportDisplay ブロックにある各要素では、id 属性がサポートされています。XData ReportDisplay で要素の id 属性の値を設定しておくと、レポートを表示する前にサーバ側でプログラムを使用してその要素にアクセスできます。

これを行うには、サーバ側のコードでクラス・メソッド %GetComponentById(id) を呼び出して、オブジェクトへのポインタを取得します。これにより、必要に応じてオブジェクトのプロパティにアクセスして変更できます。これは、content プロパティの値を最後の段階で調整する際に特に便利です。このプロパティの値は、内容がテキストである要素 (<link><inline><p><write> など) のテキスト・コンテンツです。

例えば、Zen レポート・クラスに以下の XData ReportDisplay ブロックがあるとします。

XData ReportDisplay 
  [ XMLNamespace = "http://www.intersystems.com/zen/report/display" ]
{
  <report xmlns="http://www.intersystems.com/zen/report/display"
   name="myReport">
  <html>
    <write id="A1"/>
    <write id="A2"/>
    <write id="A3"/>
  </html>
</report>
}

このクラスの OnAfterCreateDisplay() メソッドを使用すると、以下のようにこれらの <write> 要素の値を表示する前に調整できます。

ClassMethod OnAfterCreateDisplay()
{
  set write1=..%GetComponentById("A1")
  set write2=..%GetComponentById("A2")
  set write3=..%GetComponentById("A3")
  set write1.content="<h1>Hello</h1>"
  set write2.content="<h1>Hello "_%report.Month_"</h1>"
  set write3.content="<h1>Hello "_%report.GetMonth()_"</h1>"
}

OnAfterCreateDisplay() などのコールバック・メソッドの詳細は、“Zen レポート・クラスの構築” の章の “レポート生成前後のコードの実行” を参照してください。

ディメンジョンとサイズ

XData ReportDisplay ブロックでは、HTML や XSL-FO 構文と同様、さまざまな単位でサイズ (幅、高さ、長さなど) を指定できます。"2in"、"5cm"、"12px"、"14pt"、"3em"、または "75%" は、すべて Zen レポートでの長さの値として使用可能な形式です。この章では、HTML の長さの値という用語を使用して、これらの形式を使用する長さの値を表しています。

一般に、Zen でのパーセント値は、サイズがパーセントとして指定されている要素の親コンテナを基準としています。Zen レポートのテーブルでは、PDF 出力の場合のみ、パーセント値を使用して比率による列幅の指定が可能です。Zen レポートの HTML 出力でテーブルの幅の指定ではパーセントは機能しません。

ページ・レイアウトの中で Zen の自動計算を利用する場合、<document> 要素の height、margin、extent のどの属性でも、そこで指定する HTML の長さの値には "%"、"em"、および "px" を使用しないでください。

国際的な数の形式

出力規約を、既定値である北米の数の形式 (76,543,212,345.67) ではなく、ヨーロッパの数の形式 (76.543.212.345,67) や希望するその他の形式に設定することができます。そのためには、この章で後述する “<init>” セクションの説明に従って、Zen レポートに簡単な XSLT 命令を追加する必要があります。

既定の形式とスタイル

XData ReportDisplay の最上位の <report> 要素で style="none" を設定すると、Zen の標準スタイルシートは無視され、Zen レポートには定義済みのスタイルが存在しなくなります。一方、<report> で style 属性を省略すると、レポートでは Zen レポートの標準スタイルシートが使用されます。このスタイルシートは、定義済みスタイル・クラスのコレクションです。付録 “既定の形式とスタイル” には、HTML および XSL-FO 出力の既定のスタイルについての詳しい説明があります。

ページ付けおよびレイアウト

Zen レポートは、HTML と PDF の両方の形式でレポート出力を作成します。PDF でレポートを生成するとき、レポートが印刷ページでどのようにフォーマットされるかを制御することが必要となる場合があります。“<document> 要素とページ・レイアウト” のセクションでは、<document> 要素を使用して Zen レポートの PDF 出力をフォーマットする方法について説明するほか、基礎となる XSL-FO 構文の一部についても説明します。レポートが多い場合は、<document> 要素、さらには <pageheader> 要素、<pagefooter> 要素、<pagestartsidebar> 要素、そして <pageendsidebar> 要素によって十分なフォーマット機能が提供されます。

Zen レポートは、追加のフォーマット機能を提供する、追加の XSL-FO 機能をサポートします。以下のセクションでは、<document> を使用して実現可能なものより高度なレポート・フォーマットが必要な場合に使用できる機能について説明します。これらの高度なフォーマット機能には、以下のものがあります。

また、Zen レポートでは、右から左の方向に記述されるアラビア語やヘブライ語などの言語に対応する適切なページ・レイアウトの作成に必要な、XSL-FO の writing-mode 属性がサポートされます。“書き込みモード” のセクションを参照してください。

<document> 要素とページ・レイアウト

Zen レポートの <document> 要素によって、PDF 出力ページのレイアウトを制御する XSL-FO 属性の値を設定できます。

PDF 出力の生成を目的とする場合でも、<report> から <document> 要素を省略できます。その結果、既定の PDF ページ・レイアウトは、左右に 1.25 インチ、上下に 1 インチのマージンを持つ、ポートレート・モードの 8.5 × 11 インチのページになります。スタイルを定義するために、<class> 要素、<cssinclude> 要素、および <xslinclude> 要素を追加する場合は、そのコンテナとなる <document> 要素を指定する必要があります。これは、ページ・レイアウトの定義に、<document> 属性を指定しない場合も同様です。2 つ以上の <document> 要素を <report> に追加する場合は、Zen では最初の <document> 要素のコンテンツを使用し、その他を無視します。

<document> の属性の機能を理解するには、まず XSL-FO を理解する必要があります。XSL-FO に関する情報については、Web や市販書籍などに優れたソースが存在しています。しかし、基本要素および概念の一部には極めて重要ものがあるため、ここで簡単に説明します。

ページ・レイアウトで使用する XSL-FO 構文

<fo:simple-page-master> では、ページ・レイアウトのテンプレートを定義します。Zen レポートでは、生成された XSL-FO に単一の <fo:simple-page-master> 要素が追加され、これにより、レポート内のすべてのページに同じレイアウトが適用されます。追加の Zen レポート要素では、複数の <fo:simple-page-master> 要素をレポートに追加できるため、単一のレポートに複数のレイアウトを指定できます。“複数の表示レイアウト” のセクションを参照してください。

以下の <fo:simple-page-master> 属性では、ページ・レイアウトの基本プロパティを定義します。

  • page-height : ページの高さを設定します。US レター・サイズの用紙に印刷する場合は、この値は 11 インチです。

  • page-width : ページの幅を設定します。US レター・サイズの用紙に印刷する場合は、この値は 8.5 インチです。

  • margin-top : ページ上部のマージンを設定します。

  • margin-bottom : ページ下部のマージンを設定します。

  • margin-left : ページの左側のマージンを設定します。

  • margin-right : ページの右側のマージンを設定します。

  • margin : 4 つのマージンすべてに同じ値を設定します。

ページ・サイズ属性とページ・マージンでは共に、出力されたコンテンツを含むページ領域を定義します。例えば、8.5 × 11 インチで 4 つのサイドすべてのマージンが 1 インチのページでは、6.5 × 9 インチの印刷領域が定義されます。<fo:region-body> 要素によって記述されるこの領域は、<fo:simple-page-master> の子要素です。<fo:region-body> 自体に用意されているマージン・プロパティによって、本文領域の出力コンテンツが配置される、<fo:region-body> 内の領域を定義します。

  • margin-top : region-body 上部のマージンを設定します。

  • margin-bottom : region-body 下部のマージンを設定します。

  • margin-left : region-body の左側のマージンを設定します。

  • margin-right : region-body の右側のマージンを設定します。

  • margin : 4 つのマージンすべてに同じ値を設定します。

<fo:simple-page-master> には 4 つの追加の子要素があり、これを使用して他の領域の region-body にコンテンツを配置できます。

  • <fo:region-before> : region-body コンテンツの前にコンテンツを配置します。ポートレートの向きのページでは、これはページ・ヘッダになります。

  • <fo:region-after> : region-body コンテンツの後にコンテンツを配置します。ポートレートの向きのページでは、これはページ・フッタになります。

  • <fo:region-start> : コンテンツの読み込みを開始する region-body コンテンツの横にコンテンツを配置します。左から右に読む言語向けにフォーマットされた、ポートレートの向きのページでは、これは左サイドバーになります。

  • <fo:region-end> : コンテンツの読み込みが終了する region-body コンテンツの横にコンテンツを配置します。左から右に読む言語向けにフォーマットされた、ポートレートの向きのページでは、これは右サイドバーになります。

extent プロパティでは、<fo:region-start> および <fo:region-end> の幅を決定します。それらの高さは、<fo:region-body> の高さに該当します。<fo:region-before> および <fo:region-after> の幅は、<fo:region-start> と <fo:region-end> 間の距離に該当します。それらの高さは、extent プロパティによって決定されます。これらの領域に出力されたコンテンツによって、<fo:region-body> のマージン属性が割り当てるスペースが占有されます。このため、<fo:region-body> に適用されたマージンは、対応する領域の extent 属性と少なくとも同じ大きさである必要があります。そうでない場合は、出力されたコンテンツが一部重なる可能性があります。

以下の図では、XSL-FO のさまざまな要素と属性でポートレート・モードの PDF 出力ページのレイアウトを構成する様子を示しています。この図について、以下のことに注意してください。

  • このイメージは、8.5 × 11 インチのページを表示しています。

  • グレーの領域は、ページの <fo:region-body> 領域を表しています。そのディメンジョンは、<fo:simple-page-master> に設定されたマージンによって決定されます。

  • また、<fo:region-body> 領域にもマージンがあり、この図では赤線で表示されます。これらのマージンでは、コンテンツを含む <fo:region-body> の一部を定義します。

  • <fo:region-*> 領域は、<fo:region-body> 内に配置されています。これらの領域が region-body 領域に拡張される範囲は、それらの extent プロパティによって決まります。

  • <fo:region-before> 要素では、図に region-body マージンと region-before エクステントとの対話方法が示されています。マージンは少なくともエクステントと同じ大きさである必要があり、そうでない場合は、<fo:region-before> のコンテンツが <fo:region-body> のコンテンツと部分的に重なることがわかります。

ポートレート・モードの XSL-FO ページ・レイアウト
generated description: simple page master

次の図では、orientation="landscape" または referenceOrientation="90" に設定した場合と同じページ・レイアウトが示されています。このページ・レイアウトについては以下のことに注意してください。

  • このページは、時計回りに 90 度回転しているため、その上端が右に傾いています。

  • before、after、start、end の各領域要素が再配置されるため、本文領域内のコンテンツとそれらの関係が維持されます。

  • ページ・マージンは再配置されません。

ランドスケープ・モードの XSL-FO ページ・レイアウト
generated description: simple page master rotated

ページ・レイアウトで使用する <document> の属性

Zen レポート内の <document> 要素の属性を使用して、Zen レポートを PDF 出力形式に変換するために Zen が使用する、生成された XSL-FO スタイルシート内の <fo:simple-page-master> とその子要素に属性値を設定します。“<document>” セクション内の属性のテーブルでは、管理対象の XSL-FO 属性を含む、これらの属性の詳細について説明しています。以下の図では、ページ・レイアウトを管理する <document> 属性の概要を視覚的に示しています。

ポートレート・モードのページ・レイアウトで使用する <document> の属性
generated description: document page master

以下の点に注意してください。

  • <pageheader><pagefooter><pagestartsidebar> および <pageendsidebar> はそれぞれ、<fo:region-before>、<fo:region-after>、<fo:region-start> および <fo:region-end> にコンテンツを配置します。

  • headerHeight および footerHeight では、<fo:region-body> の上下のマージン値が指定されます。

  • regionBeforeExtent および regionAfterExtent では、<fo:region-before> と <fo:region-after> のエクステント値が指定されます。

  • startSidebarHeight および endSidebarHeight では、<fo:region-body> の左右のマージン値が指定されます。

  • regionBeforeExtent および regionAfterExtent では、<fo:region-before> と <fo:region-after> のエクステント値が指定されます。

以下の <document> 要素では、ヘッダが 2.5 インチ、フッタが 1.5 インチ、エクステントが 1 インチの region-after、そしてエクステントが 2 インチの region-before というページ・レイアウトが生成されます。

<document
  width="8.5in" height="11in" 
  marginLeft="1in" marginRight="1.5in" 
  marginTop="1.25in" marginBottom="1.0in"
  footerHeight="1.5in"
  headerHeight="2.5in"
  regionAfterExtent="1in"
  regionAfterColor="silver"
  regionBeforeExtent="2in"
  regionBeforeColor="silver"
  orientation="landscape" />

ここでは、以下のような XSL-FO ページ・レイアウトの定義が生成されます。

<fo:simple-page-master master-name="main"
    margin-right="1.5in" margin-left="1in"
    margin-top="1.25in" margin-bottom="1.0in"
    reference-orientation="0" 
    page-width="8.5in" page-height="11in">
   <fo:region-body margin-bottom="1.5in" margin-top="2.5in"/>
   <fo:region-before extent="2in" display-align="inherit"
       background-color="silver"/>
   <fo:region-after extent="1in" display-align="after"
       background-color="silver"/>
</fo:simple-page-master>

この XSL-FO ページ・レイアウトの定義では、以下のようなページが生成されます。

ページ・レイアウトの例
generated description: page layout

PDF レイアウトの作業で設計の変更内容を確認する際の重要な注意事項については、"<document>" のセクションの冒頭を参照してください。

条件付きページ・マージンおよびページ領域

レポートの最初のページ、最後のページ、および中間のページに対して、異なるページ・マージンまたはページ領域を持つレポートを作成する必要がある場合があります。これを実現するためには、<report> の直接の子として <pagemaster> 要素を追加し、異なるフォーマットを必要とするレポートの各ページ位置に <masterreference> 要素を追加します。<masterreference> 要素には、これがない場合には <report> の直接の子となる <document><pageheader><pagefooter><pagestartsidebar>、および <pageendsidebar> の各要素が含まれます。

以下の例は、SAMPLES ネームスペースのレポート ZENApp.MyReportOpens in a new tab に基づいています。ZENApp.MyReportOpens in a new tab で定義される ReportDefinition セクションの場合、以下の ReportDisplay は、最初のページのヘッダの高さが 2 インチで、後続のページでは 0.75 インチであるレポートを作成します。最初のページのみに表示するレポート・ヘッダ情報は、最初のページの <masterreference> 要素にあります。主な手順は以下のようになります。

  • <pagemaster> 要素をレポートに追加します。これは、<report> の直接の子である必要があります。

  • レポートの個別にフォーマットされるセクションそれぞれに <masterreference> 要素を追加します。この例では、2 つの <masterreference> 要素が必要です (最初のページ用と残りのページ用)。

  • 最初のページ用の <masterreference> は、プロパティ masterReference および pagePosition を “first” に設定します。masterReference には、任意の文字列値を指定できますが、“first” は便利なニーモニックです。

  • 最初のページ用の <masterreference> には、headerHeight を “2.0in” に指定した <document> 要素が含まれています。これにより、最初のページにタイトルおよび一般的な情報を収容する大きいヘッダが指定されます。

  • また、タイトルのバナーを含む <pageheader> 要素、およびレポートに関する一般的な情報のテーブルも含まれています。

  • 2 ページ目用の <masterreference> は、masterReferencepagePosition の両方を “rest” に設定します。masterReference には、任意の文字列値を指定できますが、“rest” は便利なニーモニックです。

  • 2 ページ目用の <masterreference> には、headerHeight を “.75in” に指定した <document> 要素が含まれています。”Sales Report” とページ番号を含む 1 行のヘッダに対しては、これで十分です。この構成では、“rest“ に指定されたページのみにページ番号を付けます。

以下のサンプル・コードは、最初のページを後続のページとは異なるフォーマットにするレポートの ReportDisplay セクションの最初の部分を示しています。

<report xmlns="http://www.intersystems.com/zen/report/display" 
  name='myReport' title='HelpDesk Sales Report' style='standard'>
  <pagemaster>
    <masterreference masterReference="first" pagePosition="first">
      <document width="8.5in" height="11in" marginLeft="1.25in" 
        marginRight="1.25in" marginTop="1.0in" 
        marginBottom="1.0in" headerHeight="2.0in"></document>
      <pageheader>
        <p class="banner1">HelpDesk Sales Report</p>
        <fo><line pattern="empty"/><line pattern="empty"/></fo>
        <table orient="row" width="3.45in" class='table1'>
          <item value="Sales by Sales Rep" width="2in">
            <caption value="Title:" width="1.35in"/></item>
          <item field="@month" caption="Month:"/>
          <item field="@author" caption="Author:"/>
          <item field="@runBy" caption="Prepared By:"/>
          <item field="@runTime" caption="Time:"/>
        </table>
      </pageheader>
    </masterreference>
    <masterreference masterReference="rest" pagePosition="rest">
      <document width="8.5in" height="11in" marginLeft="1.25in" 
        marginRight="1.25in" marginTop="1.0in" 
        marginBottom="1.0in" headerHeight=".75in"></document>
      <pageheader>
        <table orient="col" layout="fixed" width="6in">
          <item style="text-align:left" value="Sales Report" /> 
          <item style="text-align:right" special="page-number-of" />
        </table>
      </pageheader>
    </masterreference>
  </pagemaster>
 <body >
<!-- MAIN REPORT GROUP -->
  <group name="SalesRep" pagebreak="true" line='1px'>
      .
      .
      .
  </group>
 </body>
</report>

グループの各要素に対するページ・カウントのリセット

ページ番号を表示し、グループの各要素に対して 1 からページ番号付けを開始するレポートを作成する必要がある場合があります。

以下の例は、SAMPLES ネームスペースのレポート ZENApp.MyReportOpens in a new tab に基づいています。ZENApp.MyReportOpens in a new tab で定義される ReportDefinition セクションの場合、以下の ReportDisplay は、営業担当者の名前が変わったときにページ番号付けを 1 から開始し、各営業担当者のレポート・セクションの総ページ数を算出するレポートを作成します。主な手順は以下のようになります。

  • <report> 要素において、属性 primaryGroup を番号付けを開始し直すために使用する要素を含む ReportDisplay で定義されたグループの名前に設定します。この場合、グループは “SalesRep” です。以下のサンプル・コードの次の行を参照してください。

    <report xmlns="http://www.intersystems.com/zen/report/display" 
        name='myReport' title='Sales Report' primaryGroup="SalesRep">
    . . .
    </report>
    
  • <item> の属性 special の "-with-xpath" 値のいずれかを使用して、レポートにページ番号を追加します。これらの値は、ページ番号付けを、この <item> 要素の field 属性で指定される XPath 値によって制御することをレポートに指示します。この例では、"page-number-of-with-xpath" を使用し、XPath 値は “@name“ であるため、ページ番号付けは、“@name“ の値が変わると 1 から開始されます。以下のサンプル・コードの次の行を参照してください。

    <item field="@name" special="page-number-of-with-xpath" width="1in"/>
    
  • <body> 要素において、属性 genLastPageIdOn を番号付けを制御する XPath 値に設定します。これは、前の手順の field 属性で使用した Xpath 式と同じです。以下のサンプル・コードの次の行を参照してください。

    <body genLastPageIdOn="@name">
    . . .
    </body>
    
  • primaryGroup として設定されたグループと名前が一致する <group> 要素において、属性 primaryGroup を “true” に設定します。このブーリアン値は、これが番号付けを制御する要素を含む ReportDisplay グループであることを示します。以下のサンプル・コードの次の行を参照してください。

    <group name="SalesRep" primaryGroup="true">
    . . .
    </group>

以下のサンプル・コードは、営業担当者ごとにページ番号付けを開始し直すレポートの ReportDisplay セクション全体を示します。

<report xmlns="http://www.intersystems.com/zen/report/display" 
    name='myReport' title='Sales Report' primaryGroup="SalesRep">
  <document marginBottom=".75in" marginLeft=".5in" 
    marginRight=".5in" marginTop=".5in" 
    height="11in" width="8.5in"/>
  <pagefooter>
    <line pattern="solid" thickness="1px" width="7.5in"/>
    <table orient="col" width="7.5in" layout="fixed">
      <item field="@name" width="6in"/>
      <item value="Page:" width=".5in"/>
      <item field="@name" special="page-number-of-with-xpath" width="1in"/>
    </table>
  </pagefooter>
  <body genLastPageIdOn="@name">
  <!-- MAIN REPORT GROUP -->
    <group name="SalesRep" primaryGroup="true">
    <!-- SALES REP INFO -->
      <header>
        <table orient="row" width="3in" class='table2'>
          <item field="@name" width="1in">
            <caption value="Sales Rep:" style="width:2in"/></item>
          <item field="count">
            <caption value="Number of Sales:" /></item>
          <item field="subtotal" formatNumber='###,###,##0.00;(#)'>
            <caption value="Total Value of Sales:" /></item>
          <item field="avg" formatNumber='###,###,##0.000;(#)'>
            <caption value="Average Sale:" /></item>
        </table>
        <line pattern="empty" thickness="1px" width="7.5in"/>
      </header>
      <!-- TABLE OF SALES -->
      <table orient="col" group="record" width="6in" class="table4" altcolor="#DFDFFF">
        <item special="number" width=".45in" style="color: darkblue;">
          <caption value="#" /></item>
        <item field="@id" width=".7in" style="border:none;padding-right:4px">
          <caption value="Sale ID"/></item>
        <item field="date" width="1.5in" style="padding-left: 4px;">
          <caption value="Date"/></item>
        <item field="customer" width="2.65in">
          <caption value="Customer"/></item>
        <item caption="Amount" width=".7in" style="text-align:right;" 
          field="@number" formatNumber='###,###,##0.00;(#)'>
          <caption value="Amount"/>
        <summary field="subtotal" style="font-weight:bold;text-align:right" 
          formatNumber='###,###,##0.00;(#)'/></item>
      </table>
    </group>
  </body>
</report>

複数の表示レイアウト

<section> 要素により、1 つのレポートで複数のレポート形式を指定できます。<section> は、<report> の直接の子である必要があり、<report> と多くの特性を共有しています。SAMPLES ネームスペースには、1 つのレポートでの複数の表示レイアウトの使用を示す ZENReports パッケージの PageLayouts.cls と呼ばれる Zen レポート・クラスが用意されています。この例では、まずセクションの XML データを生成する XData ReportDefinition ブロックを定義します。

  • <Sales> は、SalesRep ごとに情報を編成します。

  • <ByNumber> は、売上数ごとに売上データを編成します。

  • <ByDate> は、売上日ごとに売上データを編成します。

XData ReportDisplay ブロックは、<section> 要素を使用して、各データ・セクションに対して異なるページ・フォーマットを指定します。以下では、このレポートの各セクションについて説明します。

<Sales> セクション

生成された XML の <Sales> 要素の表示セクションは、"グループの各要素に対するページ・カウントのリセット" のセクションで説明したページ・カウントをリセットするレポートに似ていますが、注意する必要があるいくつかの相違点があります。

主な相違点は以下のとおりです。

  • これは、レポートのいくつかの <section> 要素の 1 つです。<section> 要素は、<report> に似ていますが、属性 sectionName に対して文字列値が必要です。この文字列により、このセクションで生成される XSL-FO タグの値が一意になります。この例では、値は ”Sales” です。これは、このセクションの識別に役立ちます。このレポートの各セクションは、primaryGroup の値を設定します。これは、このセクションでフォーマットされる XML <group> を指定します。primaryGroup を設定すると、プライマリ・グループの要素ごとにページ番号付けを開始し直すことができます。プライマリ・グループは、このレポート・セクションの “SalesRep“ ですが、<SalesRep> は <Sales> に含まれているため、”Sales/SalesRep” を指定する必要があります。サンプル・レポートの次の行を参照してください。

    <section name="myReport" sectionName="Sales" primaryGroup="Sales/SalesRep">
    . . .
    </section>
    
  • <pagemaster> 要素には、ページ・フォーマットを指定する <masterreference> 要素が含まれています。属性 pagePosition の値は、<masterreference> がフォーマットするページを示します。この場合、first および rest です。サンプル・レポートの次の行を参照してください。

    <masterreference masterReference="first" pagePosition="first">
    . . .
    </masterreference>
    

    および

    <masterreference masterReference="rest" pagePosition="rest">
    . . .
    </masterreference>
    
  • 各 <masterreference> 要素内で、<report> でページのフォーマットに使用するのと同じ <document>、<pageheader>、および <pagefooter> の各要素内が、<masterreference> によって制御されるページをフォーマットします。例のこの部分では、<document> と <pageheader> のみを使用しています。

    <section> で設定した primaryGroup が XML コンテキストを Sales/SalesRep として確立するため、myReport または Sales の属性にアクセスするには XPath をルートから指定する必要があることに注意してください。サンプル・レポートの次の行を参照してください。

    <item field="/myReport/Sales/@month" caption="Month:" />
    
    <item field="/myReport/@author" caption="Author:" />

    ページ番号付けは、<item> の属性 special の “*-with-xpath” 値のいずれかを使用することにも注意してください。これは、field 属性の値の変化に応答して動的にページ番号を生成します。この例では、field は、プライマリ・グループ <SalesRep> の属性である @name に設定されます。このレポート・セクションは、SalesRep/@name の値が変わるたびに番号付けを 1 から開始し直します。サンプル・レポートの次の行を参照してください。

    <item 
     style="text-align:right" 
     special="page-number-of-with-xpath" 
     field="@name" />
    
  • 総ページ数は、genLastPageIdOn 値の @name によって制御されます。

    <body genLastPageIdOn="@name">
    . . .
    </body>

<ByNumber> セクション

生成された XML の <ByNumber> 要素の表示セクションは、<Sales> のセクションと似ています。重要な相違点は以下のとおりです。

  • このセクションの primaryGroup は、<ByNumber> です。これは、生成された XML の <ByNumber> グループの先頭で 1 からページ番号付けが始まり、そのグループの最後まで継続することを意味します。<Sales> セクションのレポートのようにグループの要素ごとに開始し直すのではありません。

  • <pagemaster> 要素には、firstlast、および rest のページ位置に関する <masterreference> 要素が含まれます。

  • last および rest のページ位置のレイアウトは、ページ・ヘッダを含みません。<pageheader> 要素は、これが空であっても存在する必要があることに注意してください。これは、<document> 要素にも当てはまります。

  • ページ番号付けは、XPath 値の NumbRecs によって制御されます。これは、プライマリ・グループ <ByNumber> の要素です。

    <item 
     style="text-align:right" 
     special="page-number-of-with-xpath" 
     field="NumbRecs" />
    
  • 総ページ数は、genLastPageIdOn 値の NumbRecs によって制御されます。

    <body genLastPageIdOn="NumbRecs">
    . . .
    </body>
    

<ByDate> セクション

生成された XML の <ByDate> 要素の表示セクションは、<ByNumber> のセクションと似ています。主な相違点は、セクション内で改ページが生成されないことです。したがって、<foblock>keepCondition 属性は、売上の対応リストを含むテーブルと共に、売上日を含むテーブルを保持します。keepCondition 属性については、"複数の表示コンポーネントの保持" で説明します。

複数の表示コンポーネントの保持

レポート内の複数の情報 (テーブルのタイトルとそのテーブルなど) が改ページで分離されないようにする必要がある場合があります。XSL-FO 規格には、改ページを制御できる keep-together、keep-with-next、keep-with-previous などの <fo:block> オブジェクトのプロパティが用意されています。Zen レポートの要素 <foblock> および keepCondition 属性により、Zen レポートでこれらの機能を使用できます。

<foblock> 要素は、要素を単純にグループ化します。keepCondition 属性を使用して、ブロックのコンテンツの保持条件を指定できます。

以下の例は、SAMPLES ネームスペースのレポート ZENApp.MyReportOpens in a new tab に基づいています。この例は、新しい “SalesRep“ それぞれに対して改ページを挿入しないが、“SalesRep“ 情報のテーブルにも改ページを挿入しないことを想定しています。keepConditionkeep-together.within-page='always' に設定した <foblock> に <header> を配置できます。こうすることにより、テーブルは、改ページにまたがる場合、強制的に新しいページに配置されます。

<group name="SalesRep" line='1px'>

<!-- SALES REP INFO -->
<foblock keepCondition="keep-together.within-page='always'">
 <header>
  <line pattern="empty"/>
  <table orient="row" width="3.8in" class='table2'>
   <item 
    field="@name" width="2in"><caption value="Sales Rep:" width="2in"/>
   </item>
   <item 
        field="count"><caption value="Number of Sales:"/>
   </item>
   <item 
        field="subtotal" formatNumber='###,###,##0.00;(#)'>
        <caption value="Total Value of Sales:"/>
   </item>
  </table>
  <line pattern="empty"/>

  <!-- AVERAGE/DEVIATION -->
  <table orient="col" width="6in" 
   style="border:thin solid gray;" class="invisible">
   <table orient="row" width="3in" 
    style="margin-bottom:1em;padding-left:0;" 
    class="table1" align="left">
    <item 
        field="avg" class="table1" 
        style="margin-bottom:1em;padding-left:3px;" width="1.7in" 
        formatNumber='###,###,##0.000;(#)'>
        <caption value="Average Sale:" style="width:1.3in"/>
    </item>
   </table>
  </table>
 </header>
 </foblock>

Zen レポートは、<table> の属性 rowAcrossPages もサポートします。これは、テーブルの行が改ページをまたぐことができるかどうかを制御します。テーブルのセルで折り返すほど長いデータを含む列がある、または複数の行を返す <table> であるセル・コンテンツを含む列がある <table> がある場合、この属性を使用できます。 これらの条件では、行がページの下部と次のページの上部で分割される可能性があります。行の分割を防ぐために、以下の例のように、rowAcrossPages 属性を ”false” に設定して、<table> 要素を定義します。

<table 
  group="Projects/Details" orient="col" 
  width="10.5in" layout="fixed"
  class="table5"  altcolor="#DCF9FF"  
  style="border:1pt solid black;font-size:9;" 
  rowAcrossPages="false">
      .
      .
      .
</table>

グループの要素の条件付き挿入

Zen レポートは、XPath 条件に基づいて、レポートがグループに要素を挿入または除外できるようにする機能をサポートしています。 この手法は、情報の条件付き挿入の他のメソッド (すべての要素をグループに挿入する、またはどの要素も挿入しない) とは異なります。計算結果は ReportDisplay によって実行される選択を反映しないため、グループ内の要素全体に対して実行される計算を挿入しないでください。

primaryGroup および primaryGroupifxpath の使用

ある手法では、<report> の primaryGroup 属性および primaryGroupifxpath 属性を使用します。以下の例は、SAMPLES ネームスペースのレポート ZENApp.MyReportOpens in a new tab に基づいています。ZENApp.MyReportOpens in a new tab で定義される ReportDefinition セクションの場合、以下の ReportDisplay は、指定された営業担当者のみを含むレポートを作成します。主な手順は以下のようになります。

  • <report> の属性 primaryGroup は、検討中のグループが "SalesRep" となるように指定します。属性 primaryGroupifxpath は、グループ “SalesRep“ のメンバがレポートに含まれている必要があるという条件を設定します。以下のサンプル・コードの次の行を参照してください。

    <report 
     xmlns="http://www.intersystems.com/zen/report/display" 
     name='myReport' title='HelpDesk Sales Report' style='standard' 
     primaryGroup="SalesRep" primaryGroupifxpath="@name != 'Jack'">
     . . .
    </report>
  • <item> の属性 special は、値 "page-number-of-with-xpath" を使用して、属性 field で指定された “@name“ の値が変わったときに 1 から番号付けをし直すレポートにページ番号を追加します。以下のサンプル・コードの次の行を参照してください。

    <item field="@name" 
     special="page-number-of-with-xpath" width="1in"/>
  • <body> の属性 genLastPageIdOn は、レポートが "@name" の値を使用して、レポートに含まれている “SalesRep“ の各項目に対して一意の最終ページ識別子を生成する必要があることを指定します。このことにより、各営業担当者に対して 1 からページ番号付けを開始できます。以下のサンプル・コードの次の行を参照してください。

    <body genLastPageIdOn="@name">
     . . .
    </body>
  • レポートに primaryGroup を設定すると、レポートは、プライマリ・グループの要素それぞれを処理し、name ではなく primaryGroup をレポートに含まれる要素の XML コンテキストにします。このことにより、XML の要素および属性を処理する方法が変わります。以下の行は、どのように <myReport> の属性へのフル・パスを指定する必要があるかを示しています。<SalesRep> の name 属性へのフル・パスではありません。

<item field="/myReport/@author" caption="Author:"/>
<item field="/myReport/@runBy" caption="Prepared By:"/>
<item field="/myReport/@runTime" caption="Time:"/>
<item field="@name" caption="Name:"/>

以下のサンプル・コードは、primaryGroupifxpath を使用して、条件付きで要素を <SalesRep> に挿入するレポートの ReportDisplay セクションの最初の部分を示しています。

<report xmlns="http://www.intersystems.com/zen/report/display" 
    name='myReport' 
    title='HelpDesk Sales Report' style='standard' 
    primaryGroup="SalesRep" primaryGroupifxpath="@name != 'Jack'" >
  <document width="8.5in" height="11in" 
   marginLeft="1.25in" marginRight="1.25in" 
   marginTop="1.0in" marginBottom="1.0in">
  </document>
  <pagefooter>
    <line pattern="solid" thickness="1px" 
     color="green" width="7.5in"/>
    <table orient="col" width="7.5in" layout="fixed">
      <item field="@name" width="6in"/>
      <item value="Page:" width=".5in"/>
      <item field="@name" 
       special="page-number-of-with-xpath" width="1in"/>
    </table>
  </pagefooter>
  <body genLastPageIdOn="@name">
  <header> 
  <!-- REPORT HEADER -->
    <p class="banner1">HelpDesk Sales Report</p>
    <fo><line pattern="empty"/><line pattern="empty"/></fo>
    <table orient="row" width="3.45in" class='table1'>
      <item value="Sales by Sales Rep" width="2in">
        <caption value="Title:" width="1.35in"/>
      </item>
      <item field="../@month" caption="Month:"/>
      <item field="/myReport/@author" caption="Author:"/>
      <item field="/myReport/@runBy" caption="Prepared By:"/>
      <item field="/myReport/@runTime" caption="Time:"/>
      <item field="@name" caption="Name:"/>
    </table>
  </header>
   . . .
 </body>
</report>

testEachifxpath の使用

別の手法では、<group> の testEachifxpath 属性を使用します。以下の例は、SAMPLES ネームスペースのレポート ZENApp.MyReportOpens in a new tab に基づいています。ZENApp.MyReportOpens in a new tab で定義される ReportDefinition セクションの場合、以下の ReportDisplay は、指定された営業担当者のみを含むレポートを作成します。主な手順は以下のようになります。

  • <group> の属性 testEachifxpath は、グループ “SalesRep” のメンバがレポートに含まれている必要があるという条件を設定します。以下のサンプル・コードの次の行を参照してください。

    <group name="SalesRep" testEachifxpath="@name != 'Jack'" >
       . . . 
    </group>
    
  • レポートの XML コンテキストは、primaryGroup を設定しても変更されませんでした。したがって、レポートの要素および属性に通常の方法でアクセスします。

以下のサンプル・コードは、testEachifxpath を使用して、条件付きで要素を <SalesRep> に挿入するレポートの ReportDisplay セクションの最初の部分を示しています。

<report xmlns="http://www.intersystems.com/zen/report/display" 
    name='myReport' title='HelpDesk Sales Report' style='standard'>
 <document width="8.5in" height="11in" 
    marginLeft="1.25in" marginRight="1.25in" 
    marginTop="1.0in" marginBottom="1.0in">
 </document>
 <body>
    <header> 
    <!-- REPORT HEADER -->
      <p class="banner1">HelpDesk Sales Report</p>
      <fo><line pattern="empty"/><line pattern="empty"/></fo>
      <table orient="row" width="3.45in" class='table1'>
      <item value="Sales by Sales Rep" width="2in">
        <caption value="Title:" width="1.35in"/></item>
      <item field="@month" caption="Month:"/>
      <item field="@author" caption="Author:"/>
      <item field="@runBy" caption="Prepared By:"/>
      <item field="@runTime" caption="Time:"/>
    </table>
  </header>
  <!-- MAIN REPORT GROUP -->
  <group name="SalesRep" testEachifxpath="@name != 'Jack'" >
   . . . 
  </group>
 </body>
</report>

書き込みモード

writing-mode 属性では、テキストを読む方向に関連するページ・レイアウト機能を制御します。例えば、左から右に読まれる言語では、テーブルの最初の列がページの左側にある必要がありますが、右から左に読まれる言語では、右側にある必要があります。

テキスト内の文字の順番は Unicode の双方向アルゴリズムで制御されます。このアルゴリズムでは、writing-mode 属性によってではなく、文字内にエンコードされた向きの情報が解釈されます。writing-mode は、括弧や引用符など、方向の判定が難しい文字を適切に配置して向きを決める際に役立ちます。必要があれば、文字の順番は、<bidioverride> 要素で適切に調整できます。

以下のテーブルでは、writing-mode 属性をサポートする Zen レポートの要素をまとめています。

Zen レポートの要素 生成された XSL-FO 要素

<report>

writing-mode 属性を <fo:page-sequence> 要素に追加します。これにより、レポート全体に対して書き込みモードが設定されます。レポートに複数の <section> 要素が含まれている場合は、各 <section> によって生成された <fo:page-sequence> 要素に writing-mode 属性を追加します。

<section>

<section> によって生成された <fo:page-sequence> 要素に writing-mode 属性を追加します。

<document>

writing-mode 属性を <fo:simple-page-master> 要素に追加します。writing-mode (<document> 上) では、サイドバーの配置が制御されます。writing-mode="lr" の場合は、<pagestartsidebar> が左サイドバー、<pageendsidebar> が右サイドバーになります。writing-mode="rl" の場合はその逆になります。

<container>

<container> によって生成された <fo:block-container> 要素に writing-mode 属性を追加します。

<inlinecontainer>

writing-mode 属性を <fo:inline-container> 要素に追加します。

<table>

<table> によって生成された <fo:table> 要素に writing-mode 属性を追加します。

複雑なスクリプトをサポートするフォント

以下の 2 つのセクションでは、指定の FOP レンダリング・エンジンによる PDF レンダリングのサポート対象となる複雑なスクリプトをサポートするフォントをリストします。

アラビア語

デーヴァナーガリー

要素を表示するための条件式

<document> を除くすべての XData ReportDisplay 要素では、その出力を条件式を使用して制御できます。 指定した式の評価が True の場合はレポートで要素が表示されますが、False の場合は表示されません。

ここで説明する属性は、その属性を使用する要素内に含まれるすべての要素に適用されます。そのため、例えば <table> 要素で ifexpression または ifxpath を使用した場合、式の値に応じて、その結果では <table> 内のすべての要素を含む <table> 要素全体が表示されるか、あるいは表示されません。以下は、ifexpression の使用例です。例で示している特殊変数 %report についての詳細は、後述の ifexpression の詳細説明を参照してください。

<table orient="row" width="3.45in" class="table1"
       ifexpression="%report.Month=1">
  <item value="Sales by Sales Rep" width="2in">
    <caption value="Title:" width="1.35in"/>
  </item>
  <item field="@month" caption="Month:"/>
  <item field="@author" caption="Author:"/>
  <item field="@runBy" caption="Prepared By:"/>
  <item field="@runTime" caption="Time:"/>
</table>

<document> を除くすべての XData ReportDisplay 要素では、以下の属性がサポートされています。これらの属性のいずれかを使用して、要素の出力を制御するための条件式を指定できます。

ifexpression

ifexpression 属性の値は、 要素の出力を制御する ObjectScript 式です。True の場合、要素はレポートに出力され、False の場合、要素は出力されません。

式には、プライベート変数を指定することはできません。ただし、特殊変数 %report を使用してレポート・クラスを指定したり、%report にドット構文を使用して Zen レポート・クラスのプロパティやメソッドを参照したりすることができます。以下に例を示します。

 <p ifexpression="%report.Month=1">
  This is January! Cold! Yea!
 </p>
 <p ifexpression="%report.Month>1">
  This is later than January! Spring is around the corner!
 </p>

上記の例では、以下の構文を使用して、Zen レポート・クラスの Month プロパティを参照しています。

%report.Month

以下の構文規約を使用することはできません。このコンテキストでは機能しません。

..Month

同様に、以下の構文を使用して、Zen レポート・クラスの myMethod() メソッドを参照することもできます。

%report.myMethod()

以下の構文規約を使用することはできません。このコンテキストでは機能しません。

..myMethod()

##class(myClass).myMethod()

レポートを起動する URI で ZENURL として渡されたプロパティ値に依存するように ifexpression%report を使用する場合、XSLT 処理をブラウザで行うと、予測できない結果となることがあります。この問題の詳細は、“URI による Zen レポート・クラスのプロパティの設定” を参照してください。

ObjectScript の一般的な知識は、これらの式の構成方法を知るうえで役立ちます。"Caché ObjectScript の使用法" の、特に “演算子と式” の章の “文字列関係演算子” を参照してください。

ifxpath

ifxpath 属性の値は、 要素の出力を制御する XPath 式です。True の場合、要素はレポートに出力され、False の場合、要素は出力されません。

この式は、レポートの XML データ・ソースに基づいており、XPath 構文を使用します。以下がその例です。

<p ifxpath='SalesRep[@name="Jack"]'>Oh boy, Jack is here!</p>

ifxpath は XPath 式であるため、XPath および XML の構文規則に従う必要があります。比較に、「より小さい」を意味する文字 < を使用することはできません。代わりに、< を表す XML エスケープされた XML エンティティである &amp;lt; を使用してください。

以下の例では、id という属性の値が 100 未満かどうかをテストする ifxpath 式の正しい構文を示します。

<item field="@id" ifxpath="@id&amp;lt;100" />

includeColIfExpression

includeColIfExpression 属性の値は、 レポートへの特定のデータ列の出力を制御する ObjectScript 式です。True の場合、列は出力され、False の場合、列は出力されません。

式には、プライベート変数を指定することはできません。ただし、特殊変数 %report を使用してレポート・クラスを指定したり、%report にドット構文を使用して Zen レポート・クラスのプロパティやメソッドを参照したりすることができます。

レポートを起動する URI で ZENURL として渡されたプロパティ値に依存するように includeColIfExpression%report を使用する場合、XSLT 処理をブラウザで行うと、予測できない結果となることがあります。この問題の詳細は、“URI による Zen レポート・クラスのプロパティの設定” を参照してください。

includeColUnlessExpression

includeColUnlessExpression 属性の値は、 includeColUnlessExpression 属性は、レポートへの特定のデータ列の出力を制御する ObjectScript 式です。includeColUnlessExpression は、論理上 includeColIfExpression の逆の式です。つまり、False の場合に列が出力され、True の場合は列が出力されません。

式には、プライベート変数を指定することはできません。ただし、特殊変数 %report を使用してレポート・クラスを指定したり、%report にドット構文を使用して Zen レポート・クラスのプロパティやメソッドを参照したりすることができます。以下に例を示します。

<item field="@LocationCode"
      includeColUnlessExpression=
      '%report.GroupOption="Unit"'>
  <caption value="Unit"
           includeColUnlessExpression=
           '%report.GroupOption="Unit"'/>
</item>

レポートを起動する URI で ZENURL として渡されたプロパティ値に依存するように includeColUnlessExpression%report を使用する場合、XSLT 処理をブラウザで行うと、予測できない結果となることがあります。この問題の詳細は、“URI による Zen レポート・クラスのプロパティの設定” を参照してください。

includeColIfXPath

後の文節に含まれる includeColIfXPath 属性は includeColIfExpression と類似していますが、値が ObjectScript 式ではなく、XPath 式である点は違います。また、ifxpath 属性とも類似しており、レポート内データの列ではなく、要素の出力を制御します。XPath 式の評価が True の場合、列は出力され、False の場合、列は出力されません。

includeColUnlessXPath

後の文節に含まれる includeColUnlessXPath 属性は includeColUnlessExpression と類似していますが、値が ObjectScript 式ではなく、XPath 式である点は違います。XPath 式の評価が False の場合、列は出力され、True の場合、列は出力されません。

unlessexpression

unlessexpression 属性の値は、レポートへの特定のデータ列の出力を制御する ObjectScript 式です。unlessexpression は、論理上 ifexpression の逆の式です。つまり、False の場合に列が出力され、True の場合は列が出力されません。

以下の例では、GroupOption が NULL の場合を除き、項目が必ず出力されます。concat などの XPath 関数への文字列引数を一重引用符で囲むことはできません。二重引用符または &quot エンティティを使用する必要があります。

<item 
  field='concat(/CurrAdm/LeftGroup,Adm/groupby," 
  Comment: ", Adm/groupbydesc)'
  unlessexpression='%report.GroupOption=""' />

レポートを起動する URI で ZENURL として渡されたプロパティ値に依存するように unlessexpression%report を使用する場合、XSLT 処理をブラウザで行うと、予測できない結果となることがあります。この問題の詳細は、“URI による Zen レポート・クラスのプロパティの設定” を参照してください。

値を表示するための条件式

<item><p>、および <inline> の各要素では、if 属性と expression 属性がサポートされています。これらの属性を使用すると、次のテーブルに示す説明のように、要素の値を条件に応じて表示できます。

属性 説明
expression

if の条件が True の場合、レポート出力内に式の結果が表示される ObjectScript 式。

if

expression の結果の出力を制御する ObjectScript 式。if 式の評価が True (ObjectScript のゼロ以外の値) の場合は、expression の結果がレポートに出力されます。それ以外の場合は、expression の結果は出力されません。

if の既定値は 1 (True) です。if に値を指定しない場合、その要素では常に expression の結果が出力されます。

<p> および <inline> 要素の動作は、expression 属性のコンテンツと他のコンテンツを組み合わせている場合、<item> 要素の動作とは異なります。<p> または <inline> 要素のコンテンツには、要素に含まれるテキスト、field 属性、および条件付きで expression 属性を指定できます。これら 3 つのソースのコンテンツは同時に出力されます。これらのコンテンツは、fieldexpression、テキスト・コンテンツの順に配置されます。

<item> 要素のコンテンツには、fieldspecialexpression、および value の各属性を指定できますが、<item> のレポートに出力されるコンテンツは、これらの属性のいずれか 1 つに限られます。複数の属性のコンテンツが使用可能な場合、<item> で出力されるコンテンツは、優先度の高い方から fieldspecialexpressionvalue の順序で選択されます。<item> に expression および value 属性が使用されており、if 属性の評価が False の場合でも、引き続き expression のほうが value よりも優先されます。結果として、レポートには何も出力されません。

if または expression の値には、プライベート変数を指定することはできません。ただし、特殊変数 %report を使用して、Zen レポート・クラスのプロパティを参照することができます。そのため、Zen レポート・クラスの employeeId というプロパティを参照するには、以下の構文を使用できます。

<item expression='%report.employeeId' if='1' /> 

以下のように始まるレポート・クラス定義の場合:

Class my.SimpleReport Extends %ZEN.Report.reportPage
{
Parameter REPORTNAME = "SimpleReport";
Parameter XSLTMODE = "server";
Property Title As %String (ZENURL="TITLE");
//... and so on
}

以下に、Title を使用する expression 例を示します。これらの URI には、読みやすくするためにのみ改行が追加されています。正しい URI は全体が 1 行です。%20 の文字シーケンスによって、出力にスペース文字を提供しています。これらの例で、57772 は、Caché 用に構成されている Web サーバ・ポートです。

http://localhost:57772/csp/mine/my.SimpleReport.cls
?$MODE=html&$EMBEDXSL=1&TITLE=My%20Title%20Example
http://localhost:57772/csp/mine/my.SimpleReport.cls
?$MODE=pdf&TITLE=My%20Title%20Example

以下の例では、ブラウザからではなく、コマンド・ラインからレポートを実行します。

 ZN "MINE"
 SET %request=##class(%CSP.Request).%New()
 SET %request.URL = "/csp/mine/SimpleReport.xml"
 SET %request.CgiEnvs("SERVER_NAME")="127.0.0.1"
 SET %request.CgiEnvs("SERVER_PORT")=57777
 SET rpt=##class(my.SimpleReport).%New()
 SET rpt.Title="My Title Example"
 SET tSC=rpt.GenerateReport("C:\TEMP\SimpleReport.html",1)
 IF 'tSC DO $system.Status.DecomposeStatus(tSC,.Err) WRITE !,Err(Err) ;'
 WRITE !,tSC

プロパティが NULL 以外の場合にのみ式を表示する必要がある場合は、XML および ObjectScript の両方において特殊文字である、引用符の処理に特別な操作が必要になります。以下の例では、ObjectScript で標準の二重引用符文字をエスケープするための &quot;、および “等しくない“ ことを示す '= が正しく示されています。

<item expression='%report.Title' if="%report.Title'=&quot;&quot;"/> 

以下の例では、ObjectScript 関数 $TRANSLATE ($TR) を使用して、スペース文字を削除し、expression の結果が NULL 以外の場合のみ結果を表示します。

<item expression='$TR(%report.Title," ")' 
  if="%report.Title'=&quot;&quot;'" />

レポートを起動する URI で ZENURL として渡されたプロパティ値に依存するように %report を使用する場合、XSLT 処理をブラウザで行うと、予測できない結果となることがあります。この問題の詳細は、“URI による Zen レポート・クラスのプロパティの設定” を参照してください。

<report>

<report> 要素は、XData ReportDisplay ブロック内の必須の最上位コンテナです。

Important:

もう 1 つ別の <report> 要素は、XData ReportDefinition ブロック内の必須の最上位コンテナです。詳細は、“Zen レポートのデータの収集” を参照してください。

XData ReportDisplay ブロック内では、以下の要素を <report> に記述できます。

  • <init> — 最上位のスタイルシートで XSLT 命令を実行します。

  • <section> — 1つの <report> に複数のレポート表示定義を作成できる <report> に似た要素。レポートに <section> を記述する場合、<section> の外部の <document>、<body> などの要素を記述しないでください。<section> には以下のものを記述できます。

  • <pagemaster> — レポート内の最初のページ、最後のページ、残りのページ、または任意のページのフォーマットを指定できます。

  • <document> — PDF のページ・レイアウト、および HTML 出力と PDF 出力のその他のスタイルを設定します。

  • <pageheader> — ページ・ヘッダ。PDF で使用します。HTML ではオプションです。

  • <pagefooter> — ページのフッタ。PDF のみで使用します。

  • <pagestartsidebar> — ページのサイドバー。ドキュメント上でテキストの開始位置側に配置されます。左から右に読まれる言語では、これは左サイドバーになります。PDF のみで使用されます。

  • <pageendsidebar> — ページのサイドバー。ドキュメント上でテキストの終了位置側に配置されます。左から右に読まれる言語では、これは右サイドバーになります。PDF のみで使用されます。

  • <body> — レイアウト、スタイル、および外観を制御する要素のコンテナ。この要素は必須です。

    • <call> — ストリームを返すメソッドを呼び出し、要素の出現場所でストリームをレポート定義に挿入します。この機能により、別々に開発したサブレポートからレポートを作成できます。

XData ReportDisplay ブロックに記述する <report> 要素には以下の属性があります。

属性 説明
表示の条件式 <report> 要素を条件付きで出力するための属性の詳細は、“要素を表示するための条件式” のセクションを参照してください。
id オプションの識別子。この属性を設定しておくと、%GetComponentById(id) メソッドを呼び出すことにより、サーバ側コードでのこの要素の取得に使用できます。
primaryGroup

ページ番号付けの制御に使用する必要がある XData ReportDefinition ブロックでグループを指定します。これは、以下のように ReportDefinition セクションのグループの名前で設定します。<report xmlns="http://www.intersystems.com/zen/report/display" name=”SalesReport" title="Sales Report" primaryGroup="SalesRep">

これは、<item> の属性 special および <body> の属性 genLastPageIdOn の “*-with-xpath“ 値と共に使用します。

属性 primaryGroup を “true“ に設定した <group> 要素では、ページ番号が 1 にリセットされると自動的に改ページが行われるため、属性 pagebreak を “true“ に設定する必要はありません。

primaryGroupifxpath

レポートに要素を含めるかどうかを決めるためにプライマリ・グループの各要素に適用する条件を指定する XPath。

name

レポート名。このレポートの XML データにある最上位要素名と同じ名前にする必要があります。

この XML の生成で、同じ Zen レポート・クラスにある XData ReportDefinition ブロックを使用している場合、XData ReportDisplay にある <report> 要素の name 属性は、XData ReportDefinition にある <report> 要素の name 属性と一致している必要があります。

指定した name が XML 識別子として無効な文字列である場合、レポートは正常に機能しません。明らかに使用を避けなければならない文字は、空白文字、および XML の標準エンティティの 5 文字 (&'<>") です。

style

style 属性を省略すると、レポートには Zen レポートの標準スタイルシートが使用されます。style="none" に設定すると、Zen の標準スタイルシートは無視され、Zen レポートで定義済みスタイルはありません。

既定のスタイルの詳細は、“既定の形式とスタイル” のセクションを参照してください。

terminateIfEmpty

True の場合で、レポートのデータがない場合は、空白ページを表示せずに “データがありません” というメッセージを表示します。

この属性で基本となるデータ型は %ZEN.Datatype.booleanOpens in a new tab です。 “Zen レポート属性のデータ型” を参照してください。

title

レポートのタイトル。PDF ファイル名や HTML ページ・タイトルなどの項目に使用されます。

この属性に普通のテキストを入力できる場合でも、基本となるデータ型 %ZEN.Datatype.captionOpens in a new tab が与えられます。 “Zen レポート属性のデータ型” を参照してください。

特殊変数 %display は、XData ReportDisplay の <report> コンテナを表します。%display オブジェクトのプロパティは、<report> 要素の属性に対応します。このドキュメントの “Zen レポートでの実行時式の使用法” のセクションで %display の説明も参照してください。

<init>

<init> 要素を <report> 内に記述する場合には、<document> 要素の前に置く必要があります。<init> を使用すると、他のスタイルシートが処理される前に、カスタム XSLT 命令を Zen レポート用に生成された XSLT スタイルシートの最上位レベルに挿入することができます。

通常、<init> には <xslt> 要素のみを記述します。

以下の例では、<init>、<xslt>、およびカスタム XData ブロックを組み合わせて使用し、出力規約を既定値である北米の数の形式 (76,543,212,345.67) ではなく、ヨーロッパの数の形式 (76.543.212.345,67) に設定しています。

このトピックの次のセクション “<xslt>” で詳述するように、<xslt> はカスタム XData ブロックと共に機能します。この XData ブロックには、挿入する XSLT 命令を記述します。ヨーロッパの数の形式の規約を設定するには、XData ブロックに以下の xsl:decimal-format 命令を含める必要があります。

XData EuropeanNumberFormat
{
<zenxslt>
  <xsl:decimal-format name="euro"
                      decimal-separator=","
                      grouping-separator="."/>
</zenxslt>
}

このカスタム XData ブロックを参照する <xslt> 要素は、同じ Zen レポート・クラスの XData ReportDisplay ブロックの <init> 要素内に指定する必要があります。以下の例では、<xslt> 要素で all 属性を使用して、EuropeanNumberFormat というカスタム XData ブロックを参照しています。all 属性は、この XData ブロック内の XSLT 命令を、レポート出力 (XHTML および PDF の両方) のスタイルシートに適用することを示しています。

XData ReportDisplay
  [ XMLNamespace = "http://www.intersystems.com/zen/report/display" ]
{
  <report xmlns="http://www.intersystems.com/zen/report/display"
          name="myReport" style="standard" >
    <init>
      <xslt all="EuropeanNumberFormat"/>
    </init>
    <document width="8.5in" height="11in"
              marginLeft="1.25in" marginRight="1.25in"
              marginTop="1.0in" marginBottom="1.0in">
    </document>
    <body>
      <!-- Contents of report here -->
    </body>
  </report>
}

<xslt>

Zen レポートの大きな利点は、XSLT が生成されることです。また一方で、Zen レポートでは <xslt> 要素を提供しており、生成された XSLT にカスタム XSLT 命令を追加することができます。

<xslt> 要素は、XData ReportDisplay ブロック内の任意の場所に指定できますが、記述した XSLT 命令を生成されたスタイルシートの最上位レベルに適用する必要がある場合は、<xslt> 要素を <init> ブロック内で指定します。例えば、<init> がコンテナとして適しているのは、<xslt> 要素を使用して XSLT グローバル変数の値を定義する場合などです。

<xslt> 要素では、Zen レポート・クラス内のカスタム XData ブロックを指定する必要があります。この XData ブロックは固有の名前を持ち、XData ReportDefinition または XData ReportDisplay とは異なります。このカスタム XData ブロックでは、Zen レポートの XSLT スタイルシートに追加したい XSLT 命令を記述します。

カスタム XData ブロックを作成したら、<xslt> 構文で allhtml、または xslfo のうちいずれか 1 つの属性を使用して、この XData ブロックを指定する必要があります。指定した属性によって、XSLT 命令を適用する出力のタイプ (すべての形式の出力、HTML のみ、または PDF のみ) が決まります。

以下のセクションで、詳細を説明します。

<xslt> およびその属性

<xslt> には、以下のテーブルで説明する属性があります。

属性 説明
all すべてのタイプの出力用に生成された XSLT スタイルシートで使用する XSLT 命令を定義している Zen レポート・クラスの XData ブロックの名前。これらの XSLT 命令は、すべての形式の Zen レポート出力 (XHTML および PDF の両方) に適用されます。all 属性以外の使用可能な属性については、html および xslfo を参照してください。
expressions vars にリストされている対応する変数に値を提供する 1 つ以上の式をセミコロンで区切って並べたリスト。expressions には、XSLT 式または ObjectScript 式を指定できます。ObjectScript の場合、例で示すように ! (感嘆符) 演算子を先頭に付ける必要があります。
html XHTML 出力専用に生成された XSLT スタイルシートで使用する XSLT 命令を定義している Zen レポート・クラスの XData ブロックの名前。html 属性以外の使用可能な属性については、all および xslfo を参照してください。
id オプションの識別子。この属性を設定しておくと、%GetComponentById(id) メソッドを呼び出すことにより、サーバ側コードでのこの要素の取得に使用できます。
vars 1 つ以上の XSLT 変数をセミコロンで区切って並べたリスト。expressions 属性は、これらの変数の値を提供します。
xslfo PDF 出力専用に生成された XSLT スタイルシートで使用する XSLT 命令を定義している Zen レポート・クラスの XData ブロックの名前。xslfo 属性以外の使用可能な属性については、all および html を参照してください。

以下の例では、<xslt> 要素に all 属性を指定して、setsize を参照しています。setsize は、次のセクション “<xslt> で参照する XData ブロック” で説明する Zen レポート・クラス内のカスタム XData ブロックの名前です。

XData ReportDisplay
[ XMLNamespace = "http://www.intersystems.com/zen/report/display" ]
{
  <report xmlns="http://www.intersystems.com/zen/report/display"
          name="Container">
    <init>
      <xslt all="setsize" vars="orientation"
            expressions="!%report.Orientation"/>
    </init>
    <document width="{$width}" height="{$height}"
              margin="10mm" size="{$orientation}" />
    <!-- Other elements for the report -->
  </report>
}

上記の例では、<init> および <xslt> を使用して、Zen レポート・クラスの Orientation プロパティの値を orientation という XSLT グローバル変数に渡しています。この値は、上記の例およびこのセクション内の他の例で示している $orientation$width、および $height のように、引き続きグローバル変数の通常の XSLT 構文を使用して参照することができます。

<xslt> で参照する XData ブロック

以下の例では、前のセクション “<xslt> およびその属性” で示した <xslt> 要素と共に機能する setsize という XData ブロックを示しています。

この XData ブロックの例では、<zenxslt> というルート要素を使用して XSLT 文のコンテナとしています。<zenxslt> コンテナは、<xslt> で参照する XData ブロック内に定義する XSLT 文のルートが 1 つもない場合に必要です。これにより、完成した XData ブロックには 1 つのみルート要素が含まれていることになり、適格な XML とすることができます。コンパイル時に、<zenxslt> コンテナは削除され、Zen レポート用に生成されたスタイルシートに XSLT 文が追加されます。

XData setsize
{
<zenxslt>
  <xsl:variable name="height">
    <xsl:choose>
      <xsl:when test="$orientation='landscape'">
        <xsl:value-of select="'210mm'"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="'297mm'"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:variable>
  <xsl:variable name="width">
    <xsl:choose>
      <xsl:when test="$orientation='landscape'">
        <xsl:value-of select="'297mm'"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="'210mm'"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:variable>
</zenxslt>
}

このサンプル XData ブロックは、XSLT グローバル変数の height および width の値を、XSLT グローバル変数 orientation の値に基づいて条件付きで定義します。前のトピック “<xslt> およびその属性” では、<init> 要素および <xslt> 要素を使用して、XSLT 変数 orientation に Zen レポート・クラスの Orientation プロパティの現在の値を渡す方法について説明しています。ただし、Orientation プロパティがその値を取得する方法に関する制約はありません。既定値が使用されている場合や、Zen レポート・クラスにその値を設定するコードが含まれている場合があります。次のセクションでは、ユーザが Zen レポートを呼び出す際にブラウザに渡す URI から、Orientation プロパティの値を動的に設定する方法について説明します。

<xslt> を使用した XSLT グローバル変数の設定

Zen レポート・クラス内の Orientation を、以下のように ZENURL プロパティとして定義すると仮定します。

Property Orientation As %ZEN.Datatype.string(ZENURL="ORIENT");

このセクションで説明しているその他の規約にかかわらず、上記の ZENURL 文は、Zen レポートを呼び出す際に ORIENT という URI クエリ・パラメータを使用できるということを意味しています。この操作を行うと、Zen レポート・クラスの Orientation プロパティに、URI 内で ORIENT に割り当てた値が提供されます。URI クエリ・パラメータでは、その値を引用符で囲まないことに注意してください。次に例を示します。


http://localhost:57772/csp/hs/ZR.SDA.cls?ORIENT=portrait

次に、“<xslt> およびその属性” で説明した <xslt> 要素と、“<xslt> で参照する XData ブロック” で説明した XData ブロックがあると想定します。これらを組み合わせて使用することで、XSLT グローバル変数 orientation に Zen レポート・クラス・プロパティ Orientation の値を設定できます。また、XSLT グローバル変数の height および width の値を、orientation の値に基づいて適切に設定できます。

次の 4 つの例は、Zen レポートを呼び出す際に Zen レポート・クラスの Orientation プロパティを設定することのできる URI 文字列の例です。


http://localhost:57772/csp/hs/ZR.SDA.cls?$MODE=pdf&ORIENT=portrait

http://localhost:57772/csp/hs/ZR.SDA.cls?$MODE=pdf&ORIENT=landscape

http://localhost:57772/csp/hs/ZR.SDA.cls?$MODE=html&ORIENT=portrait

http://localhost:57772/csp/hs/ZR.SDA.cls?$MODE=html&ORIENT=landscape

<section>

<section> 要素により、1 つの <report> に複数のレポート表示定義を作成できます。これは、<report> の直接の子である必要があり、また、ページ・フォーマットに <pagemaster> 要素を含む必要があります。<pagemaster> の他に、<section> は、<body> 要素を含む必要があります。この要素は、レポートの本文に有効なものを記述します。<section> は、<report> と同じプロパティのほとんどをサポートします。追加のプロパティ sectionName が必要です。これは、生成される XSL-FO で一意の識別子を生成するために使用されます。

<pagemaster>

<pagemaster> 要素により、レポートの異なるページにフォーマットを指定できます。これは、<report> 要素または <section> 要素の直接の子にできます。これには、1 つ以上の <masterreference> 要素が含まれます。

<masterreference>

<masterreference> 要素により、特定のページのフォーマットを指定できます。これは、<pagemaster> の直接の子である必要があります。<masterreference> には、<document><pageheader><pagefooter><pagestartsidebar>、および<pageendsidebar> の各要素を記述できます。これらの要素は、順番に組み込む必要があり、どの要素もスキップできません。例えば、<document> 要素のみを指定する必要がある場合、<pageheader> および <pagefooter> を含める必要はありませんが、<pagefooter> のみを指定する必要がある場合、<document> と <pageheader> の両方を含める必要があります (これらが空の場合も同様)。

<masterreference> には以下の属性があります。

属性 説明
masterReference

任意の文字列にできます。これは、レポートのセクションにあるオブジェクトの一意の識別子を作成するために使用されます。

pagePosition

<fo:conditional-page-master-reference> XSL-FO オブジェクトの page-position 属性の値を指定します。有効な値は、“first“、“last“、“rest“、“any“ です。

<document>

<document> 要素では、PDF 出力のページ・レイアウトやスタイルの特性を指定します。PDF ページ・レイアウトの概要は、“<document> 要素とページ・レイアウト” のセクションを参照してください。

<document> では、<class><cssinclude>、および <xslinclude> の各要素を複数記述して、カスタム・スタイルを設定できます。その結果は、これらの要素での選択内容に応じて、XHTML 出力または PDF 出力に個別にまたは同様に適用できます。<class><cssinclude>、および <xslinclude> については、このトピックの該当セクションを参照してください。

PDF 出力ページを設計する際に、異なるレイアウトを次々と試す場合には注意してください。<document> 要素を編集してマージン値の変更、ヘッダの調整、またはポートレートからランドスケープへのモード切り替えを行うと、次に Zen レポートを表示しても変更内容が PDF 出力に反映されないことがあります。変更した内容が表示されないので、誤った結論を導く可能性があります。これは、以前に表示されたページのキャッシュが原因で、特に Firefox で発生する場合があります。この問題を解決するには、完全に Firefox を終了して、新しい Firefox セッションを開始してから、変更した Zen レポートを表示する必要があります。Caché を再起動する必要はありませんが、Firefox をいったん終了して再起動する必要があります。

<document> 要素は、ページ・レイアウト機能を制御する多数の属性をサポートしています。以下のテーブルでは、それらを機能別にグループ化して示しています。

以下の属性ではページのマージンを制御します。

属性 説明
margin

生成された XSL-FO スタイルシートで、<fo:simple-page-master> 要素の margin 属性に長さを示す HTML 値を指定します。

margin 値を指定すると、marginBottommarginLeftmarginRight、および marginTop に指定されている値はすべて、margin で指定した値に置き換えられます。

marginBottom

生成された XSL-FO スタイルシートで、<fo:simple-page-master> 要素の margin-bottom 属性に長さを示す HTML 値を指定します。

margin 値を指定すると、marginBottommarginLeftmarginRight、および marginTop に指定されている値はすべてその値に置き換えられます。

marginLeft marginBottom での下部のマージン設定と同様に、左側のマージンを設定します。
marginRight marginBottom での下部のマージン設定と同様に、右側のマージンを設定します。
marginTop marginBottom での下部のマージン設定と同様に、上部のマージンを設定します。

以下の属性では、生成された XSL-FO の <fo:region-body> 要素のマージンを制御します。

属性 説明
endSidebarLength

生成された XSL-FO 内で、<fo:region-body> 要素の margin-right 属性に長さを示す HTML 値を指定します。これにより、ページ・フッタのテキストを含む、<fo:region-end> の占有領域が定義されます。

レポートに <pageendsidebar> を記述する場合は、endSidebarLength を指定し、この endSidebarLengthregionEndExtent より大きな値にして、テキストが部分的に重ならないようにする必要があります。レポートに <pageendsidebar> を記述しない場合は、regionEndExtentendSidebarLength を省略することもできます。endSidebarLength の既定値は 0 です。

startSidebarLength プロパティでは、<fo:region-start> に対して同じ機能が実行されます。

"2in"、"5cm"、"12px"、"14pt"、"3em"、または "75%" は、すべて HTML の長さの値として使用可能な形式です。パーセント (%) は、長さを指定する要素のコンテナを基準とします。

ページ・レイアウトの中で Zen の自動計算を利用する場合、<document> の height、margin、extent のどの属性でも、そこで指定する HTML の長さの値には "%"、"em"、および "px" を使用しないでください。

footerHeight

生成された XSL-FO 内で、<fo:region-body> 要素の margin-bottom 属性に長さを示す HTML 値を指定します。これにより、ページ・フッタのテキストを含む、<fo:region-after> の占有領域が定義されます。

レポートに <pagefooter> を記述する場合は、footerHeight を指定し、この footerHeightregionAfterExtent より大きな値にして、テキストが部分的に重ならないようにする必要があります。レポートに <pagefooter> を記述しない場合、regionAfterExtentfooterHeight は省略してもかまいません。footerHeight の既定値は 0 です。

headerHeight では、<fo:region-before> に対して同じ機能が実行されます。

"2in"、"5cm"、"12px"、"14pt"、"3em"、または "75%" は、すべて HTML の長さの値として使用可能な形式です。パーセント (%) は、長さを指定する要素のコンテナを基準とします。

ページ・レイアウトの中で Zen の自動計算を利用する場合、<document> の height、margin、extent のどの属性でも、そこで指定する HTML の長さの値には "%"、"em"、および "px" を使用しないでください。

headerHeight footerHeight でのフッタの高さ設定と同様に、ヘッダの高さを設定します。
startSidebarLength endSidebarLength での <fo:region-end> 定義と同様に、<fo:region-body> 内の <fo:region-start> の占有領域を定義します。

<fo:region-body>、ページ・ヘッダ、ページ・フッタ、およびサイドバーの各コンテンツ領域には、スタイルなどの領域特性を制御する類似名称の属性セットがあります。以下のテーブルでは、生成された XSL-FO の <fo:region-after> 要素に対応する <pagefooter> の制御を行う属性のリストを示します。他の領域を制御する属性も同様に動作します。

属性 説明
regionAfter

このセクションの冒頭の図で示しているように、ページの <fo:region-after> 領域に割り当てるスタイル。

また、regionAfterColorregionAfterDisplayAlignregionAfterExtentregionAfterName、および regionAfterOrientation というさらに特殊な属性を使用できます。

regionBefore, regionStart, regionEnd ではそれぞれ、 <fo:region-before>、<fo:region-start>、および <fo:region-end> に対して同じ機能が実行されます。

regionAfterColor

生成された XSL-FO スタイルシートで、<fo:region-after> 要素の background-color 属性に値を指定します。これは、診断の目的で役立ちます。

regionBeforeColor, regionStartColor, regionEndColor ではそれぞれ、 <fo:region-before>、<fo:region-start>、および <fo:region-end> に対して同じ機能が実行されます。

regionAfterDisplayAlign

生成された XSL-FO スタイルシートで、<fo:region-after> 要素の display-align 属性に値を指定します。

  • auto — ここでは、該当する場合に relative-align プロパティを使用します。

  • before — この領域の “前” 端に位置を合わせます。

  • center — この領域の中央に合わせます。

  • after — この領域の “後” 端に位置を合わせます。

regionBeforeDisplayAlign, regionStartDisplayAlign, regionEndDisplayAlign ではそれぞれ、 <fo:region-before>、<fo:region-start>、および <fo:region-end> に対して同じ機能が実行されます。

regionAfterExtent

生成された XSL-FO 内で、<fo:region-after> 要素の extent 属性に長さを示す HTML 値を指定します。<fo:region-after> 要素にはページ・フッタ・コンテンツが含まれています。既定値は 0 です。

レポートに <pagefooter> を記述する場合は、footerHeight を指定し、この footerHeightregionAfterExtent より大きな値にして、コンテンツが部分的に重ならないようにする必要があります。regionAfterExtent の値は、目的とするフッタの内容を記述するうえで十分な大きさに設定します。レポートに <pagefooter> を記述しない場合、regionAfterExtentfooterHeight は省略してもかまいません。

regionBeforeExtent, regionStartExtent, regionEndExtent ではそれぞれ、 <fo:region-before>、<fo:region-start>、および <fo:region-end> に対して同じ機能が実行されます。

regionAfterName

region-body 内の region-after 領域に名前を指定します。これを指定する場合は、この名前と <pagefooter> の regionName に指定される名前が同じになる必要があります。

regionBeforeName, regionStartName, regionEndName ではそれぞれ、 <fo:region-before>、<fo:region-start>、および <fo:region-end> に対して同じ機能が実行されます。指定された名前は、関連するページ要素の regionName と一致する必要があります。

regionAfterOrientation

<fo:region-after> 上でのコンテンツの向きを制御します。

  • 0 — コンテンツの向きは、コンテンツの上部がページの上部になります。これが既定値です。

  • 90 — コンテンツは、反時計回りに 90 度回転します。

  • 180 — コンテンツは、反時計回りにさらに 90 度回転します。

  • 270 — コンテンツが反時計回りにさらに 90 度回転して、全体で 270 度回転します。この回転は、コンテンツが時計回りに 90 度回転した場合と同じになります。

regionBeforeOrientation, regionStartOrientation, regionEndOrientation ではそれぞれ、 <fo:region-before>、<fo:region-start>、および <fo:region-end> に対して同じ機能が実行されます。

以下の残りの属性では、ドキュメントのその他の機能を制御します。

属性 説明
column-count

PDF 出力の列数を指定します。既定値は 1 です。値が 1 より大きい場合、コンテンツが第 1 列の下部から第 2 列の上部へという具合に連なって行き、ページの列が満たされるまで、出力が列にフォーマットされます。

column-gap

column-count が 1 よりも大きい場合に使用します。列間のスペースを指定します。値は明示的な長さであり、“cm” または “in” などの単位で指定します。

height

生成された XSL-FO 内で、<fo:simple-page-master> 要素の page-height 属性に長さを示す HTML 値を指定します。出力されたページの高さのディメンジョンを定義します。

id オプションの識別子。この属性を設定しておくと、%GetComponentById(id) メソッドを呼び出すことにより、サーバ側コードでのこの要素の取得に使用できます。
orientation

ページ上でのページ・コンテンツの向きを制御します。ページ自体の向きは変更されません。

  • "portrait" — コンテンツの向きは、コンテンツの上部がページの上部になります。これが既定です。referenceOrientation を 0 に設定する場合と同じです。

  • "landscape" — コンテンツは、反時計回りに 90 度回転します。orientation"landscape" を指定するのは、referenceOrientation を 90 に設定する場合と同じです。

referenceOrientation

ページ上でのページ・コンテンツの向きを制御します。ページ自体の向きは変更されません。

  • 0 — コンテンツの向きは、コンテンツの上部がページの上部になります。これが既定です。orientation"portrait" に設定する場合と同じです。

  • 90 — コンテンツは、反時計回りに 90 度回転します。orientation"landscape" に設定する場合と同じです。

  • 180 — コンテンツは反時計回りにさらに 90 度回転し、portrait モードと上下が逆の向きになります。

  • 270 — コンテンツが反時計回りにさらに 90 度回転して、全体で 270 度回転します。この回転は、コンテンツが時計回りに 90 度回転した場合と同じになります。

size

生成された XSL-FO スタイルシートの <fo:simple-page-master> size 属性の値。

width

生成された XSL-FO スタイルシート内で、<fo:simple-page-master> 要素の page-width 属性に長さを示す HTML 値を指定します。出力されたページの幅のディメンジョンを定義します。

writing-mode

生成された XSL 内で、writing-mode 属性を <fo:simple-page-master> 要素に追加します。writing-mode では、テキストを記述する方向に関連するページ・レイアウト機能を制御します。writing-mode 属性の詳細は、“書き込みモード” のセクションを参照してください。

可能な値は以下のとおりです。

  • “lr-tb” — 多くのインド・ヨーロッパ語のように、左から右、上から下に記述するテキストに対応します。

  • “rl-tb” — アラビア語やヘブライ語のように、右から左、上から下に記述するテキストに対応します。

  • “tb-rl” 中国語や日本語のように、上から下、右から左に記述するテキストに対応します。

  • “lr” — “lr-tb” と同じです。

  • “rl” — “rl-tb” と同じです。

  • “tb” — “tb-lr” と同じです。

  • “inherit” — 親要素から writing-mode の値を取得します。

すべての XSL-FO レンダラがすべての指定可能な値をサポートしているわけではありません。

writing-mode-region-after

生成された XSL 内で、writing-mode 属性を <fo:region-after> 要素に追加します。詳細は、このテーブル内の writing-mode プロパティを参照してください。

writing-mode-region-beforewriting-mode-region-bodywriting-mode-region-end、および writing-mode-region-start ではそれぞれ、<fo:region-before>、<fo:region-body>、<fo:region-end>、および <fo:region-start> に対して同じ機能が実行されます。

writing-mode-region-before

このテーブル内の writing-mode-region-after を参照してください。

writing-mode-region-body

このテーブル内の writing-mode-region-after を参照してください。

writing-mode-region-end

このテーブル内の writing-mode-region-after を参照してください。

writing-mode-region-start

このテーブル内の writing-mode-region-after を参照してください。

<class>

<class> 要素には、CSS クラス (XHTML レポートの場合) または同等の XSLT スタイルシート情報 (PDF レポートの場合) にスタイル情報を記述します。<class> 要素は、<document> の子としてのみ記述する必要があります。 複数の <class> 要素を記述できます。各 <class> 要素には、以下のテーブルで説明する属性があります。

属性 説明
表示の条件式 <class> 要素を条件付きで出力するための属性の詳細は、“要素を表示するための条件式” のセクションを参照してください。
id オプションの識別子。この属性を設定しておくと、%GetComponentById(id) メソッドを呼び出すことにより、サーバ側コードでのこの要素の取得に使用できます。
name

スタイル・クラスを示します。name の値には、以下の構文を使用する必要があります。

tagName.className

tagName には、以下の HTML タグのうちの 1 つの名前のみ指定できます。

  • a — 他のページへのリンクをフォーマットします。

  • block — インライン項目のグループをフォーマットします。

  • div — 項目のブロックをフォーマットします。

  • inline — インライン・テキストをフォーマットします。

  • p — 段落をフォーマットします。

  • table — 一般的なテーブルのレイアウトをフォーマットします。

  • td — テーブルのセルをフォーマットします。

  • th — テーブルのヘッダ・セルをフォーマットします。

tagName.className 値の className の部分には、このスタイルを一意に識別する任意のクラス名を指定できます。

以下は、有効な name 構文の例です。

name="th.myTable"

name="td.myTable"

name="a.myLink"

name="inline.myFormat"

<class> 要素には、クラスのスタイル設定情報を指定する以下の要素があります。これらの要素は、<class> の子としてのみ記述する必要があります。

  • <att> は、すべてのタイプの出力に適用するスタイル情報を指定します。

  • <atthtml> は、XHTML 出力にのみ適用するスタイル情報を指定します。

  • <attxslfo> は、PDF 出力にのみ適用するスタイル情報を指定します。

<att>、<atthtml>、および <attxslfo> には以下の属性があります。

属性 説明
表示の条件式 <att>、<atthtml>、または <attxslfo> の各要素を条件付きで出力するための属性の詳細は、“要素を表示するための条件式” のセクションを参照してください。
name 属性名。 これは CSS 属性名 (色、背景色、フォントサイズ、フォントファミリ、幅など) に対応します。 Zen は単純に <att> 属性を CSS または XSL-FO に渡すだけなので、ユーザはさまざまな内容を指定できます。この属性を解釈できるかどうかはブラウザや PDF レンダリング・ツールによります。
value 属性に割り当てる値。

以下の CSS ドキュメントと同等の内容を指定する方法を考えます。

th.myTable {
  background-color: blue;
  color: white;
}

以下の <class> 要素を使用します。

<class name="th.myTable">
  <att name="background-color" value="blue" />
  <att name="color" value="white" />
</class>

このカスタム・スタイルを <td> 要素に適用するには、<td> 要素、<td> の親の <table> 要素、または <table> の親の <body> 要素に class 属性を適用します。class 属性の値を指定するときに、<td>、<table>、<body> などの要素名は使用しないでください。スタイル名のみを使用します。例えば、使用するスタイル・クラスの名前が th.myTable である場合、<report> で次のように指定します。

<table class="myTable"> 

以下の <table> 要素では、class 属性を使用して Zen レポートのテーブルに table.grid スタイルを適用します。

<table class="grid" group="Step">
 <item width="0.8in" field="@Number" />
 <item width="0.8in" field="./AllSet" />
 <item field="./DemoText" />
</table>

class を指定していない子要素には、その親要素の class 属性の値が継承されます。したがって、table.myTableth.myTable、および td.myTable を定義する場合、<table> 要素では class 属性を指定するだけで十分です。さらに、<body> 要素の中に class 属性を記述して、レポートにあるすべての要素にクラスを定義することもできます。

class の詳細は、“Zen レポートのデータの表示” の章の “レポートの表示属性” のセクションを参照してください。

<class>、<att>、<atthtml>、および <attxslfo> を使用してオーバーライドまたは補足できる Zen レポートの既定のスタイルの詳細は、付録 “既定の形式とスタイル” の以下のトピックを参照してください。

<cssinclude>

<cssinclude> 要素は、XHTML 出力にのみ適用します。PDF 出力に使用する XSLT スタイルシートを作成する場合、クラスでは <cssinclude> 要素はすべて無視されます。

<document> 要素には、複数の <cssinclude> 要素を記述できます。各 <cssinclude> 要素には、以下のテーブルに示す属性があります。

属性 説明
表示の条件式 <cssinclude> 要素を条件付きで出力するための属性の詳細は、“要素を表示するための条件式” のセクションを参照してください。
href

HTML スタイルシートで指定する外部 CSS スタイルシートの URI。

href 文字列には、複数の URI をコンマで区切って指定できます。これにより、すべての URI を指定できます。これは複数の <cssinclude> 要素を指定することと同じです。

ブラウザによっては、参照先ファイルの拡張子が .css ではない場合に問題が発生することがあります。

id オプションの識別子。この属性を設定しておくと、%GetComponentById(id) メソッドを呼び出すことにより、サーバ側コードでのこの要素の取得に使用できます。
makeAbsoluteURL

True の場合、%request が定義されていないときには、href で指定したファイル名を絶対 URL に変換します。この URL は、Caché のインストール・ディレクトリ内の csp/namespace にあるファイルをポイントします。

この属性で基本となるデータ型は %ZEN.Datatype.booleanOpens in a new tab です。 “Zen レポート属性のデータ型” を参照してください。

<xslinclude>

PDF 出力の場合のみ、<xslinclude> 要素が XSLT スタイルシートに適用されます。HTML バージョンのレポートを作成するとき、クラスでは <xslinclude> 要素はすべて無視されます。

<document> 要素には、複数の <xslinclude> 要素を記述できます。各 <xslinclude> 要素は以下のテーブルに示す属性を持ちます。

属性 説明
表示の条件式 <xslinclude> 要素を条件付きで出力するための属性の詳細は、“要素を表示するための条件式” のセクションを参照してください。
href

to-XSLFO スタイルシートで指定する外部 XSLT ファイルのファイル名。

この機能は極めて高性能ですが、XSLT の記述は難易度の高い作業です。実用上、<xslinclude> 要素の主な目的は、CSS クラスと同等の働きを持つ <xsl:attribute-set> 要素を外部 XSLT スタイルシートに取り入れることにあります。

id オプションの識別子。この属性を設定しておくと、%GetComponentById(id) メソッドを呼び出すことにより、サーバ側コードでのこの要素の取得に使用できます。
makeAbsoluteURL

True の場合、%request が定義されていないときには、href で指定したファイル名を絶対 URL に変換します。この URL は、Caché のインストール・ディレクトリ内の csp/namespace にあるファイルをポイントします。

この属性で基本となるデータ型は %ZEN.Datatype.booleanOpens in a new tab です。 “Zen レポート属性のデータ型” を参照してください。

前述の <class> の例の続きとして、th.myTable クラスを外部ファイルからインポートするための <document> 要素は以下のようになります。

<document ....>
  <cssinclude href="myStyle.css" />
  <xslinclude href="myStyle.xsl" />
</document>

ここで、myStyle.css には以下を指定します。

th.myTable {
  background-color: blue;
  color: white;
}

myStyle.xsl には以下を指定します。

<xsl:attribute-set name="th.myTable">
  <xsl:attribute name="background-color">blue</xsl:attribute>
  <xsl:attribute name="color">white</xsl:attribute>
</xsl:attribute-set>

<pageheader>

<pageheader> 要素によって、出力された各ページの上部にあるヘッダにコンテンツが配置されます。XData ReportDisplay ブロック内の <body> 要素の前にそれを配置する必要があります。

<pageheader> には、<body> と同じレイアウト要素と表示要素を記述できます。“Zen レポートのデータの表示” の章の要素リストを参照してください。ただし、<pageheader> に記述した内容はすべて、<document> 要素の headerHeight および regionBeforeExtent 属性で指定した空白スペースに表示されます。ページ・ヘッダを PDF レポート出力に追加するには、XData ReportDisplay ブロックによって以下を記述する必要があります。

  • headerHeight および regionBeforeExtent の値を設定した <document> 要素。この headerHeight は、regionBeforeExtent よりも大きい値とする必要があります。regionBeforeExtent の値は、目的とするヘッダの内容を記述するうえで十分な大きさに設定します。

  • <pageheader> 要素

XHTML レポートではページごとにヘッダを表示できないので、XHTML レポートでは、<pageheader> の内容はレポートの先頭に表示されるだけです。

各 <pageheader> 要素には、以下のテーブルで示す属性がサポートされています。

属性 説明
表示の条件式 <pageheader> 要素を条件付きで出力するための属性の詳細は、“要素を表示するための条件式” のセクションを参照してください。
表示属性 stylewidthclass などの属性の説明は、“Zen レポートのデータの表示” の章の “レポートの表示属性” のセクションを参照してください。
id オプションの識別子。この属性を設定しておくと、%GetComponentById(id) メソッドを呼び出すことにより、サーバ側コードでのこの要素の取得に使用できます。
regionName

<pageheader> の名前。これを指定する場合は、この名前と <document> で regionBeforeName に指定される名前が同じになる必要があります。

<pagestartsidebar>

<pagestartsidebar> 要素によって、出力された各ページのサイドバーにコンテンツが配置されます。サイドバーは、ページ上でテキストの開始位置側に配置されます。左から右に読む言語では、<pagestartsidebar> によって左サイドバーが作成されます。<document> 要素で writing-mode="rl" に設定した場合は、サイドバーの場所が切り替わり、<pagestartsidebar> によって右サイドバーが作成されます。XData ReportDisplay ブロック内の <body> 要素の前にそれを配置する必要があります。

<pagestartsidebar> には、<body> と同じレイアウト要素および表示要素を記述できます。“Zen レポートのデータの表示” の章の要素リストを参照してください。ただし、<pagestartsidebar> に記述した内容はすべて、<document> 要素の startSidebarLength および regionStartExtent 属性で指定した空白スペースに表示されます。

サイドバーを PDF レポート出力に追加するには、XData ReportDisplay ブロックによって以下を記述する必要があります。

  • startSidebarLength および regionBeforeExtent の値を設定した <document> 要素。この startSidebarLength は、regionStartExtent よりも大きい値とする必要があります。regionStartExtent の値は、目的とするヘッダの内容を記述するうえで十分な大きさに設定します。"ポートレート・モードのページ・レイアウトで使用する <document> の属性" の図には、これらの関係が示されています。

  • <pagestartsidebar> 要素

HTML レポート出力には、<pagestartsidebar> 要素は表示されません。

<pagestartsidebar> 要素では、以下のテーブルで示す属性がサポートされます。

属性 説明
表示の条件式 <pagestartsidebar> 要素を条件付きで表示可能にする属性の詳細は、“要素を表示するための条件式” のセクションを参照してください。
表示属性 stylewidthclass などの属性の説明は、“Zen レポートのデータの表示” の章の “レポートの表示属性” のセクションを参照してください。
id オプションの識別子。この属性を設定しておくと、%GetComponentById(id) メソッドを呼び出すことにより、サーバ側コードでのこの要素の取得に使用できます。
regionName

<pagestartsidebar> の名前。これを指定する場合は、この名前と <document> で regionStartName に指定される名前が同じになる必要があります。

<pageendsidebar>

<pageendsidebar> 要素によって、出力された各ページのサイドバーにコンテンツが配置されます。サイドバーは、ページ上でテキストの終了位置側に配置されます。左から右に読む言語では、<pageendsidebar> によって右サイドバーが作成されます。<document> 要素で writing-mode="rl" に設定した場合は、サイドバーの場所が切り替わり、<pageendsidebar> によって左サイドバーが作成されます。XData ReportDisplay ブロック内の <body> 要素の前に <pageendsidebar> を配置する必要があります。

<pageendsidebar> には、<body> と同じレイアウト要素および表示要素を記述できます。“Zen レポートのデータの表示” の章の要素リストを参照してください。ただし、<pageendsidebar> に記述した内容はすべて、<document> 要素の endSidebarLength および regionEndExtent 属性で指定した空白スペースに表示されます。

サイドバーを PDF レポート出力に追加するには、XData ReportDisplay ブロックによって以下を記述する必要があります。

  • endSidebarLength の値を設定した <document> 要素。この endSidebarLength は、<document> の regionEndExtent よりも大きい値とする必要があります。regionEndExtent の値は、目的とするヘッダの内容を記述するうえで十分な大きさに設定します。"ポートレート・モードのページ・レイアウトで使用する <document> の属性" の図には、これらの関係が示されています。

  • <pageendsidebar> 要素

XHTML レポートには <pageendsidebar> 要素は表示されません。

各 <pageheader> 要素には、以下のテーブルで示す属性がサポートされています。

属性 説明
表示の条件式 <pageheader> 要素を条件付きで出力するための属性の詳細は、“要素を表示するための条件式” のセクションを参照してください。
表示属性 stylewidthclass などの属性の説明は、“Zen レポートのデータの表示” の章の “レポートの表示属性” のセクションを参照してください。
id オプションの識別子。この属性を設定しておくと、%GetComponentById(id) メソッドを呼び出すことにより、サーバ側コードでのこの要素の取得に使用できます。
regionName

<pageendsidebar> の名前。これを指定する場合は、この名前と <document> で regionEndName に指定される名前が同じになる必要があります。

<body>

<body> 要素は <report> の子であり、必須の要素です。 レイアウトおよびスタイルを制御する Zen レポート要素のコンテナです。

各 <body> 要素では、以下のテーブルで示す属性がサポートされています。

属性 説明
表示の条件式 <body> 要素を条件付きで出力するための属性の詳細は、“要素を表示するための条件式” のセクションを参照してください。
appendIdToZenLastPage

総ページ数を計算するために、Zen レポートは、最終ページ・マーカを生成します。複数の独立した番号セクションを持つレポートは、事実上複数の ‘最終‘ ページがあります。この属性によって、レポートは、<body> の属性 id によって指定された値を使用して一意の最終ページ・マーカを生成するようになります。これを <item> の属性 appendToZenLastPage と共に使用します。appendToZenLastPage の値は、<body> id に指定された値と一致する必要があります。

この属性で基本となるデータ型は %ZEN.Datatype.booleanOpens in a new tab です。 “Zen レポート属性のデータ型” を参照してください。

appendIdToZenLastPage 属性の使用の詳細は、"マルチセクション・レポートのページ番号付け" のセクションを参照してください。

blockZENLastPage

最終ページ参照の作成をブロックするブーリアン・フラグ。既定値は、“false“ です。これは、レポートでページ番号付けを使用していない場合に、一意の最終ページ・マーカを生成する必要を回避するために便利な ‘ショートカット‘ を提供します。

この属性で基本となるデータ型は %ZEN.Datatype.booleanOpens in a new tab です。 “Zen レポート属性のデータ型” を参照してください。

genLastPageIdOn

総ページ数を計算するために、Zen レポートは、最終ページ・マーカを生成します。複数の独立した番号セクションを持つレポートは、事実上複数の ‘最終‘ ページがあります。この属性は、一意の最終ページ・マーカを生成するために使用される XPath を提供します。これは、<item> の属性 special および <report> または <section> の属性 primaryGroup の “*-with-xpath” 値と共に使用します。

foStyle

PDF の生成用に、XSL-FO のスタイルを定義できるようにします。Zen レポートの XData ReportDisplay ブロック内の以下のエントリは、

<body foStyle="font-family='Arial' font-size='9pt'">

レポート用に生成された XSL-FO スタイルシートに、以下の出力を生成します。

<fo:flow flow-name="xsl-region-body" font-family="Arial" font-size="9pt">

foStyle 属性は、XHTML 形式の出力には適用できません。出力モードが XHTML の場合、foStyle は無視されます。

id オプションの識別子。この属性を設定しておくと、%GetComponentById(id) メソッドを呼び出すことにより、サーバ側コードでのこの要素の取得に使用できます。

<report> の <body> 要素には、レポートのデータ項目の配置やレイアウトを制御する任意の個数の要素を指定できます。リストおよび詳細は、次の章 “Zen レポートのデータの表示” を参照してください。

また、<body> 要素には、<report> のスタイルを制御する以下の要素を指定することもできます。

<call>

<call> 要素によって、別のレポートの XData ReportDisplay ブロックで作成された XSLT をレポート表示で含めることができます。別々に開発したサブレポートからレポートを作成する場合や、レポートが大きすぎてコンパイルできない場合に、便利です。<call> 要素は <body> 要素の直接の子にする必要があります。呼び出されたサブレポートには <call> 要素を含めることはできません。含まれている XSLT に独自のルート・タグがあると、レポート・プロパティの suppressRootTag が <call> で便利な場合があります。

XData ReportDisplay ブロック内で使用される場合、<call> 要素には以下の属性があります。

属性 説明
method

ストリームを返すクラス・メソッドまたはインスタンス・メソッド。このメソッドは、Zen レポートで定義する必要があります。call 要素の出現場所でストリームがレポート定義に挿入されます。

メソッドでは、サブレポートの XData ReportDisplay ブロックの出力を返したり、これ以外の機能を実行できます。サブレポートで使用する場合、このメソッドはサブレポートの新規インスタンスを作成し、GenerateStream を使用してストリームを返す必要があります。<call> 要素でこの引数を明示的に渡さない場合でも mode 引数を受け入れるメソッドを記述する必要があります。mode の値は Zen レポートにより自動的に処理され、レポートの出力モードにより決定されます。ReportDefinition ブロックからもメソッドが呼び出された場合、mode は自動的に設定されないので、メソッドで 0 に設定する必要があります。

subreport

生成された XSLT で使用される文字列を提供して、一連のフォーマット命令を指定します。生成された XSLT では同じ XML を複数回処理して、毎回異なる結果にできます。

method では SubReport プロパティを subreport と同じ文字列に設定する必要があります。subreport 属性はレポートで一意にする必要があります。これによって、各フォーマット命令が一意に識別されます。

subreportname

この属性の値は、この <call> 要素によって呼び出されるサブレポートの XData ReportDisplay ブロックの report 要素の name 属性の値です。この値により、生成 XSL が生成 XMLで適切なノードを選択できます。レポートが XData ReportDefinition ブロックでもサブレポートを呼び出す場合、これらのサブレポートの ReportDefinition ブロックの <report> 要素もこの名前を使用する必要があります。

subreportname 文字列の最初の文字に ! (感嘆符) を使用した場合、Zen レポートでは、文字列の残りの部分がその文字列を指定する ObjectScript 式として解釈されます。レポートのプロパティでレポート名を設定し、ZENURL としてプロパティを定義し、レポートを起動する URL で実行時にこれを設定できます。ObjectScript は <call> 要素のコンテキストで評価されるので、メイン・レポートでメソッドの実行に関係する式の場合、メソッド名の先頭は %report にする必要があります。

Important:

もう 1 つ別の <call> 要素は、XData ReportDefinition ブロック内で使用されます。

<call> 要素に関する問題を解決するには、"<call> 要素のトラブルシューティング" を参照してください。

<call> 要素を ReportDisplay で使用する例

SAMPLES ネームスペースでは、ZENApp パッケージにコード例が用意されています。ここでは、ReportDisplay ブロックでの <call> 要素の使用例を示しています。Zen レポート・クラス ZENApp.MyReportMain.cls では、ZENApp.MyReport.cls と同じ XML が生成されます。<call> 要素を XData ReportDisplay ブロックで使用して、その XML を 2 つの異なる方法で表示します。

XData ReportDisplay 
  [ XMLNamespace = "http://www.intersystems.com/zen/report/display" ]
{
<report xmlns="http://www.intersystems.com/zen/report/display" 
    name='myReport' title='HelpDesk Sales Report' style='standard'>

  <body>
    <header>
    <!-- Combined REPORT HEADER -->
        <p class="banner1"HelpDesk: Summary and Detail Reports</p>
        <fo><line pattern="empty"/><line pattern="empty"/></fo>
    </header>

    <call method="GetSummary" subreport="SummaryReport" />

    <call method="GetDetail" subreport="DetailReport" />

  </body>
</report>
}

method 属性では、ストリームを返すメソッドを指定します。GetSummary メソッドにより、売り上げの概要が営業担当者ごとに生成され、GetDetail により、ZENApp.MyReport.cls と同じ詳細レポートが生成されます。以下のコードは、例として GetSummary を示しています。

Method GetSummary(mode) As %GlobalCharacterStream [ ProcedureBlock = 0 ]
 {
  set (tSC,rpt,stream)=""
  set rpt=##class(ZENApp.MyReportSummary).%New()
  if rpt 
  {
    set rpt.SubReport="SummaryReport" 
    set tSC=rpt.GenerateStream(.stream,mode)
  }
  if $$$ISERR(tSC) {set stream=""}
  quit stream
 }

ReportDisplay ブロックからのサブレポートの呼び出しで使用されるメソッドは基本的に、ReportDefinition ブロックにおいて <call> で使用されるメソッドと同じです。ReportDisplay ブロックから呼び出されるメソッドは、mode 引数を取り、modeGenerateStream に渡す必要があります。Zen レポートでは自動的に mode の値を指定します。この例では、GetSummary メソッドでレポート ZENApp.MyReportSummary.cls を呼び出し、GetDetailZENApp.MyReport.cls を呼び出します。ReportDefinition ブロックから呼び出されるメソッドのシグニチャに mode を含めることができますが、Zen レポートでは自動的に値を指定しないため、メソッドは既定値を用意する必要があります。

subreport 属性は、XSLT で使用される文字列を指定し、各サブレポートで生成されるフォーマット・コマンドを特定します。Zen レポートでは XML を複数回処理して、毎回異なる結果にできます。メソッドでは、%ZEN.Report.reportPageSubReport プロパティを subreport と同じ値に設定する必要があります。

<call> を ReportDefinition と ReportDisplay で使用する例

SAMPLES ネームスペースでは、ZENApp パッケージにコード例が用意されています。ここでは、ReportDefinition ブロックと ReportDisplay ブロックの両方で <call> 要素を使用する例を示しています。Zen レポート・クラス ZENApp.MyReportBoth.cls では、ZENApp.MyReportByDay.clsZENApp.MyReportByRep.cls のサブレポートから複合レポートを作成します。ZENApp.MyReportBoth.cls の ReportDefinition ブロックでは GetSubDailyGetSubRep のメソッドを呼び出します。それぞれはサブレポートを呼び出し、レポートの XML を生成します。前のセクションの “<call> 要素を使用する例” では、この種の呼び出しについて説明しています。

ZENApp.MyReportBoth.cls の ReportDisplay ブロックでは GetSubDailyDsplGetSubRepDspl のメソッドを呼び出します。<call> がここで使用されている方法は、“<call> 要素を ReportDisplay で使用する例” のセクションに記載されている方法に似ていますが、subreportname という属性が追加されています。この属性の値は、サブレポートにおいて ReportDisplay ブロックの <report> 要素の name 属性に一致する必要がある文字列です。Zen レポートではこの名前を使用して、サブレポートにより生成された XML でノードを検索します。

XData ReportDisplay [ XMLNamespace = "http://www.intersystems.com/zen/report/display" ]
{
<report xmlns="http://www.intersystems.com/zen/report/display" 
name='myReport' title='HelpDesk Combined Sales Report' style='standard'>
  <document width="8.5in" height="11in" marginLeft="1.25in"
      marginRight="1.25in" marginTop="1.0in" marginBottom="1.0in">
  </document>
  <body>
    <header> 
      <!-- COMBINED REPORT HEADER -->
      <p class="banner1">HelpDesk Combined Sales Report </p>
      <fo> <line pattern="empty"/>  <line pattern="empty"/> </fo>
        <table orient="row" width="3.45in" class='table1'> 
        <item value="Combined Sales" width="2in">
          <caption value="Title:" width="1.35in"/>
        </item>
        <item field="@month" caption="Month:"/>
        <item field="@author" caption="Author:"/>
        <item field="@runBy" caption="Prepared By:"/>
        <item field="@runTime" caption="Time:"/>
        </table>
    </header>
    <call method="GetSubDailyDspl" subreport="DailyReport" 
        subreportname="myReportByDay" />
    <call method="GetSubRepDspl" subreport="RepReport" 
        subreportname="myReportByRep" />
  </body>
</report>
}

また、GetSubDailyDsplGetSubRepDspl のメソッドは、%ZEN.Report.reportPage.MainReport の値をメイン・レポートの名前に設定します。これは生成された XML の最上位レベルの要素でもあります。以下のコードは、MainReport セットのある GetSubDailyDspl を示しています。

Method GetSubDailyDspl(mode) As %GlobalCharacterStream [ ProcedureBlock = 0 ]
{
 set (tSC,rpt,stream)=""
 set rpt=##class(ZENApp.MyReportByDay).%New()
 if rpt {
   set rpt.SubReport="DailyReport"
   set rpt.MainReport="myReport" 
   set tSC=rpt.GenerateStream(.stream,mode)
 }
 if $$$ISERR(tSC) {set stream=""}
 quit stream
}

subreportname 属性と MainReport の値は、この 2 レベル構造で要素を検索するのに必要な情報を生成された XSLT に提供します。レポートの MainReport プロパティと <call> の subreportname 属性が、生成された XML で最上位レベルの要素と 2 番目のレベルの要素にどのように対応するかを次の図に示します。

MainReport と subreportname
generated description: report both

<fo>

<fo> 要素には、<body> と同じ要素を記述できます。次の章 “Zen レポートのデータの表示” の要素リストを参照してください。

ただし、<fo> に記述した内容はすべて、XSL-FO (つまり、PDF) レポートにのみ表示される点が異なります。<fo> は、ページ区切りなど、ページ固有の差異により、XHTML レポートと PDF レポートが同じ状態で表示されないという問題の解決に便利です。

<fo> には以下の属性があります。

属性 説明
表示の条件式 <fo> 要素を条件付きで出力するための属性の詳細は、“要素を表示するための条件式” のセクションを参照してください。
表示属性 stylewidthclass などの属性の説明は、“Zen レポートのデータの表示” の章の “レポートの表示属性” のセクションを参照してください。
caption

(オプション) このブロックのキャプション・テキスト。

この属性に普通のテキストを入力できる場合でも、基本となるデータ型 %ZEN.Datatype.captionOpens in a new tab が与えられます。 “Zen レポート属性のデータ型” を参照してください。

id オプションの識別子。この属性を設定しておくと、%GetComponentById(id) メソッドを呼び出すことにより、サーバ側コードでのこの要素の取得に使用できます。

<foblock>

<foblock> 要素は、生成された XSL-FO の <fo:block> になります。これを使用して、ブロック・レベル・スタイルを <inline> コンポーネントのグループに適用するなど、レポートで形式設定用に要素をグループ化できます。

<foblock> には以下の属性があります。

属性 説明
表示の条件式 <foblock> 要素を条件付きで出力するための属性の詳細は、“要素を表示するための条件式” のセクションを参照してください。
表示属性 stylewidthclass などの属性の説明は、“Zen レポートのデータの表示” の章の “レポートの表示属性” のセクションを参照してください。
keepCondition

(オプション) XSL-FO の保持条件を指定する文字列。任意の有効な保持条件を使用できますが、多くの場合、最も便利な条件は以下のとおりです。

"keep-together.within-page='always'"

これは、<foblock> 内のすべてのコンテンツを 1 つのページに保持します。

id オプションの識別子。この属性を設定しておくと、%GetComponentById(id) メソッドを呼び出すことにより、サーバ側コードでのこの要素の取得に使用できます。

<html>

<html> 要素は <fo> と同じ要素と属性をサポートしていますが、<html> のコンテンツは XHTML レポートにのみ表示されます。

<write>

<write> 要素は、レポートではなく、スタイルシートに直接記述します。<write> 要素は、<body> 要素、<pageheader> 要素、<pagefooter> 要素、<pagestartsidebar> 要素、および <pageendsidebar> 要素のどこにでも適切に記述できます。ただし、<write> は <fo> または <html> での使用が最も有効です。以下はその例です。

<html>
  <write>
     <span>This is HTML!</span> 
  </write>
</html>
<fo>
  <write>
     <fo:block>This is XSL-FO</fo:block> 
  </write>
</fo>

<write> 要素では、以下のテーブルで示す属性がサポートされています。

属性 説明
表示の条件式 <write> 要素を条件付きで出力するための属性の詳細は、“要素を表示するための条件式” のセクションを参照してください。
id オプションの識別子。id を使用すると、<write> 要素にアクセスしてそのコンテンツをプログラムで変更できます。詳細は、このテーブルの後に示す content プロパティの説明を参照してください。

<write> 要素は、Zen レポート・クラスの %ZEN.Report.Display.writeOpens in a new tab の XML プロジェクションです。オンラインのクラスリファレンス情報でこのクラスについて参照すると、content というプロパティが含まれていることがわかります。Zen では、ここに XData ReportDisplay の <write> 要素と </write> 要素の間に置いたテキストが格納されます。レポートを表示する前にサーバ側で <write> 要素のテキストをプログラムで変更する必要がある場合は、クラス・メソッドの %GetComponentById(id) を呼び出して、%ZEN.Report.Display.writeOpens in a new tab オブジェクトへのポインタを取得します。これにより、必要に応じてこのオブジェクトの content プロパティにアクセスして、その値を変更できます。使用例は、“Zen レポートのページのフォーマット” の章の “id 属性” を参照してください。

content プロパティをプログラムで操作する場合は、このテキスト文字列に、基本となるデータ型 %ZEN.Datatype.captionOpens in a new tab が実際に含まれるように留意してください。 “Zen レポート属性のデータ型” を参照してください。

FeedbackOpens in a new tab