機械翻訳について

データの処理

これらのセクションでは、テンプレート内のデータを処理するメソッドについて説明します。

データのソート

グループ内の任意の要素でグループをソートできます。 グループ・タグ内に次の構文を挿入します:

<?sort:element name; order; data-type?>

where

element nameは、グループをソートする要素の名前です

順序は'昇順'または'降順'です

data-typeは、要素のデータ型です。 有効な値は次のとおりです: 'text'および'number'。

順序が指定されていない場合、デフォルトでは、ソート順序は昇順です。 データ型が指定されていない場合、型はテキストとみなされます。

たとえば、最も高い給与が最初に表示されるように、データセットをSALARYという名前のエレメントでソートするには、次のように入力します:

<?sort:SALARY;'descending';'number'?>

for-eachグループ内でソートする場合は、for-each文の後にソート文を入力します。 たとえば、買掛/未払金請求書台帳(この章の最初に表示)をサプライヤ(VENDOR_NAME)でソートするには、次のように入力します:

<?for-each:G_VENDOR_NAME?><?sort:VENDOR_NAME?>

グループを複数のフィールドでソートするには、適切な順序で追加のソート文を入力します。 たとえば、サプライヤでソートしてから請求書番号でソートするには、次のように入力

<?sort:VENDOR_NAME?> <?sort:INVOICE_NUM;'ascending';'number'?>

Null値のチェック

XMLデータ内には、エレメントの値の3つのシナリオが考えられます。

シナリオ:

  • 要素はXMLデータに存在し、値があります。

  • 要素はXMLデータに存在しますが、値がありません。

  • XMLデータに要素がないため、値がありません。

レポート・レイアウトでは、要素の存在とその値に応じて異なる動作を指定できます。 次の例は、"if"文を使用してこれらの各条件を確認する方法を示しています。 構文は、他の条件付き書式設定構成でも使用できます。

  • 要素が存在し、値がnullでない場合の動作を定義するには、次を使用します:

    <?if:element_name!=' '?> 「望ましい動作」 <?end if?>

  • 要素が存在するがnullの場合の動作を定義するには、次を使用します:

    <?if:element_name and element_name="?> 「望ましい動作」 <?end if?>

  • 要素が欠落している場合の動作を定義するには、次を使用します:

    <?if:not(element_name) ?> 「望ましい動作」 <?end if?>

XMLデータの再グループ化

RTFテンプレートでは、元のデータに存在しない階層にXMLデータを再グループ化できるXSL 2.0 for-each-group標準がサポートされています。

この機能を使用すると、テンプレートはソースXMLファイルの階層に従う必要はありません。 したがって、データ・ソースの構造によって制限されなくなります。

XMLサンプル

このXMLサンプルは、for-each-group標準を使用するデータのセットを示しています。

for-each-group標準を示すために、CDカタログ一覧の次のXMLデータ・サンプルがテンプレートに再グループ化されます:

<CATALOG>
   <CD>
      <TITLE>Empire Burlesque</TITLE>
      <ARTIST>Bob Dylan</ARTIST>
      <COUNTRY>USA</COUNTRY>
      <COMPANY>Columbia</COMPANY>
      <PRICE>10.90</PRICE>
      <YEAR>1985</YEAR>
   </CD>
   <CD>
      <TITLE>Hide Your Heart</TITLE>
      <ARTIST>Bonnie Tylor</ARTIST>
      <COUNTRY>UK</COUNTRY>
      <COMPANY>CBS Records</COMPANY>
      <PRICE>9.90</PRICE>
      <YEAR>1988</YEAR>
   </CD>
   <CD>
      <TITLE>Still got the blues</TITLE>
      <ARTIST>Gary More</ARTIST>
      <COUNTRY>UK</COUNTRY>
      <COMPANY>Virgin Records</COMPANY>
      <PRICE>10.20</PRICE>
      <YEAR>1990</YEAR>
   </CD>
   <CD>
      <TITLE>This is US</TITLE>
      <ARTIST>Gary Lee</ARTIST>
      <COUNTRY>UK</COUNTRY>
      <COMPANY>Virgin Records</COMPANY>
      <PRICE>12.20</PRICE>
      <YEAR>1990</YEAR>
   </CD>

再グループ化構文を使用して、CDを国別、さらに年別にグループ化するこのデータのレポートを作成できます。 表示されたデータ構造によって制限されることはありません。

構文の再グループ化

適切な構文を使用してデータを再グループ化できます

データを再グループ化するには、次の構文を使用します:

<?for-each-group: BASE-GROUP;GROUPING-ELEMENT?>

たとえば、CDリストをCOUNTRYで再グループ化するには、テンプレートに次のように入力します:

<?for-each-group:CD;COUNTRY?>

COUNTRYと同じ階層レベルの要素がCOUNTRYの子になります。 その後、グループの要素を参照して、必要な値を表示できます。

すでに定義されているグループ内にネストされたグループ化を確立するには、次の構文を使用します:

<?for-each:current-group(); GROUPING-ELEMENT?>

たとえば、COUNTRYでCDグループ化を宣言した後、COUNTRY内のYEARでさらにグループ化できます:

<?for-each:current-group();YEAR?> 

実行時に、「パブリッシャ」は新しいグループ化の出現をループし、テンプレートで定義したフィールドを表示します。

ノート:

この構文は、単純なXSL for-each-group構文です。 前述の簡略化された構文を使用しない場合は、次のようにXSL構文を使用できます。 XSL構文は、テンプレートのフォーム・フィールド内でのみ使用できます。
<xsl:for-each-group
  select=expression
  group-by="string expression"
  group-adjacent="string expression"
  group-starting-with=pattern>
  <!--Content: (xsl:sort*, content-constructor) -->
</xsl:for-each-group>

テンプレートの例

この例では、テンプレートを拡張するために使用できるいくつかの機能を確認できます。

次の図は、CDを国、年、および各CDの詳細を表示するテンプレートを示しています。

次の表に、前の図に示したテンプレートのフォーム・フィールドで行われた「パブリッシャ」構文エントリを示します。

デフォルト・テキスト・エントリ フォーム・フィールドのヘルプ・テキスト入力 説明

国別グループ

<?for-each-group:CD;COUNTRY?>

<?for-each-group:CD;COUNTRY?>タグは、新しいグループを宣言します。 既存のCDグループをCOUNTRY要素で再グループ化します。

USA

<?COUNTRY?>

COUNTRYタグのデータ値を表示するプレースホルダー。

年別グループ

<?for-each-group:current-group();YEAR?>

<?for-each-group:current-group();YEAR? > タグは、YEAR要素によって現在のグループ(COUNTRY)を再グループ化します。

2000

<?YEAR?>

YEARタグのデータ値を表示するプレースホルダー。

グループ: 詳細

<?for-each:current-group()?>

データがCOUNTRY、YEARの順にグループ化されると、<?for-each:current-group()?>コマンドを使用して現在のグループの要素(YEAR)をループし、表のデータ値(TITLE、ARTISTおよびPRICE)をレンダリングします。

自分のCD

<?TITLE?>

TITLEタグのデータ値を表示するプレースホルダー。

John Doe

<?ARTIST?>

ARTISTタグのデータ値を表示するプレースホルダー。

1.00

<?PRICE?>

PRICEタグのデータ値を表示するプレースホルダー。

終了グループ

<?end for-each?>

<?for-each:current-group()?>タグを閉じます。

年別グループ終了

<?end for-each-group?>

<?for-each-group:current-group();YEAR?>タグを閉じます。

国別終了グループ

<?end for-each-group?>

<?for-each-group:CD;COUNTRY?>タグを閉じます。

このテンプレートは、XMLファイルとのマージ時に次の図に示すレポートを生成します。

式による再グループ化

式で再グループ化すると、関数またはコマンドをデータ要素に適用し、返された結果でデータをグループ化できます。

この機能を使用するには、再グループ化構文内で式を次のように記述します:

<?for-each:BASE-GROUP;GROUPING-EXPRESSION?>

この機能をデモンストレーションするために、1か月当たりの平均温度のみを含むXMLデータ・サンプルが、特定の範囲内の平均温度を持つ月数を計算するテンプレートへの入力として使用されます。

次のXMLコードは、<temp>グループで構成されます。 各<temp>グループには、その月の平均温度を含む<month>要素と<degree>要素が含まれます:

<temps>
  <temp>
    <month>Jan</month>
    <degree>11</degree>
  </temp> 
  <temp>
    <month>Feb</month>
    <degree>14</degree>
  </temp>  
  <temp>
    <month>Mar</month>
    <degree>16</degree>
  </temp> 
  <temp>
    <month>Apr</month>
    <degree>20</degree>
  </temp> 
  <temp>
    <month>May</month>
    <degree>31</degree>
  </temp>
  <temp>
    <month>Jun</month>
    <degree>34</degree>
  </temp> 
  <temp>
    <month>Jul</month>
    <degree>39</degree>
  </temp> 
  <temp>
    <month>Aug</month>
    <degree>38</degree>
  </temp>
  <temp>
    <month>Sep</month>
    <degree>24</degree>
  </temp>  
  <temp>
    <month>Oct</month>
    <degree>28</degree>
  </temp> 
  <temp>
    <month>Nov</month>
    <degree>18</degree>
  </temp> 
  <temp>
    <month>Dec</month>
    <degree>8</degree>
  </temp> 
</temps>         

次の図に示すように、このデータを温度範囲を示す形式で表示し、それらの範囲を満たす平均温度がある月の数を表示するとします。

for-each-groupコマンドを使用して、温度を10度ずつグループ化できる式を<degree>要素に適用できます。 次に、各グループのメンバーの数(各範囲内の平均温度を持つ月数)を表示できます。

次の図は、前の図に示したレポートを作成するためのテンプレートを示しています。

次の表は、前の図に示したテンプレートで行われたフォーム・フィールド・エントリを示しています。

デフォルト・テキスト・エントリ フォーム・フィールドのヘルプ・テキスト入力

TmpRngでグループ化

<?for-each-group:temp;floor(degree div 10)?> <?sort:floor(degree div 10)?>

次の範囲

<?concat(floor(degree div 10)*10,' F to ',floor(degree div 10)*10+10, 'F')?>

月数

<?count(current-group())?>

終了TmpRng

<?end for-each-group?>

フォーム・フィールドのタグについては、次の点に注意してください:

  • <?for-each-group:temp;floor(degree div 10)?>は、再グループ化タグです。 既存の<temp>グループの場合、要素は式floor(degree div 10)によって再グループ化されることを指定します。 floor関数は、引数より小さい最大整数を返すXSL関数です(たとえば、1.2は1を返し、0.8は0を返します)。

    この場合、<degree>要素の値が10で除算されます。 これにより、XMLデータから次の値が生成されます: 1、1、1、2、3、3、3、3、3、2、2、1、および0。

    これらはソートされるため、処理時に次の4つのグループが作成されます: 0、1、2、および3。

  • <?concat(floor(degree div 10)*10,'F to ', floor(degree div 10)*10+10,'F'?>は、行ヘッダーの温度範囲を10単位で表示します。 式は、現在のグループの値に10を掛け、現在のグループの値に10 + 10を掛けた値を連結します。

    したがって、最初のグループ0の場合、行見出しは0から(0 +10)、または0から10 Fと表示されます。

  • <?count(current-group())?>は、count関数を使用して、現在のグループのメンバー(範囲を満たす温度の数)をカウントします。

  • <?end for-each-group?>タグはグループ化を閉じます。