XVCDによる数値計算

XVCDを使用して数値計算をするボキャブラリコンポーネントの作成手順を、簡単な例を示して説明します。

1. このチュートリアルの内容

このチュートリアルでは、XVCDを使用して数値計算をするボキャブラリコンポーネントの作成手順を、わかりやすさを優先した非常に簡単な例題を使い、順を追って見ていきます。このチュートリアルを実践することで、数値データの集計・分析に用いられるボキャブラリコンポーネントを作成できるようになります。

このチュートリアルを実践するために必要な知識や、開発環境の準備については、「XVCDで開発する環境の準備」をご覧ください。また、このチュートリアルを実践する前に、「XVCDによるボキャブラリコンポーネントの作成」を読み終えていることを想定しています。

このチュートリアル内のサンプルコードは、xfy Developer's Toolkit 配布パッケージ内のdoc/samples/developers/tutorial/calculation_tutorialに収録されています。xfy Developer's Toolkitには、このチュートリアルのほかにも豊富なXVCDサンプルが用意されています。ぜひ、それらのサンプルもご覧ください。

なお、このチュートリアルでは、xfyユーザーエージェントとして、xfy Basic Editionに含まれるxfy Clientを使用します。チュートリアルを進めるときは、xfy Clientでブラウズバーを表示すると便利です。xfy Clientをインストールした直後は、ブラウズバーは表示されていません。ブラウズバーを表示するには、[表示 - ブラウズバー]を選択します。

2. XVCDによる数値計算

XVCDでの計算はXPath式で行います。この章では、xfyプラットフォームでXML文書内の数値を計算するボキャブラリコンポーネントをXVCDで作るための最小セットを知ることができます。

2.1. XML文書の定義

まず、表示対象となるXML文書ファイルを用意します。 ここでは、次のような品物の単価と数の一覧を表現するXML文書を作成します。

<?xml version="1.0"?>

<sample:items xmlns:sample="http://xmlns.xfy.com/sample/calculation"> 
    <sample:item> 
        <sample:title>リンゴ</sample:title> 
        <sample:price>100</sample:price> 
        <sample:quantity>10</sample:quantity> 
    </sample:item> 
    <sample:item> 
        <sample:title>ミカン</sample:title> 
        <sample:price>50</sample:price> 
        <sample:quantity>30</sample:quantity> 
    </sample:item> 
</sample:items>

このXML文書には、sample:items要素の子要素として sample:item要素があります。sample:item要素は品物1件を表します。sample:item要素の中にsample:title要素とsample:price要素、sample:quantity要素があります。 sample:title要素には品物の名前が、sample:price要素には単価が、sample:quantity要素には数量が、それぞれ設定されています。

XML文書が作成できたら、Calculation.xmlというファイル名で適切なフォルダに保存します。

2.2. XVCDによるボキャブラリコンポーネントの作成

次に、XVCDでXML文書内の数値を計算するボキャブラリコンポーネントを作成します。XML文書内の数値を使った計算は、XPath式を記述して実現します。例えば、sample:price要素とsample:quantity要素とをかけ算する場合、次のようなXPath式を記述します。

<xvcd:value-of select="number(sample:price)*number(sample:quantity)"/>

この式では、XPath関数のnumber()を使って文字列を数値に変換し、計算しています。

実際にこの式を使用してサンプルのXML文書内のデータを計算するXVCDは、次のとおりです。強調文字で表記された箇所が、XPath式で計算をしている箇所です。

<?xml version="1.0"?>

<xvcd:xvcd
    xmlns:xvcd="http://xmlns.xfy.com/xvcd" 
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:sample="http://xmlns.xfy.com/sample/calculation"
    version="1.0">

    <xvcd:vocabulary name="Calculation" match="sample:items" call-template="root"/>

    <xvcd:template name="root">
        <html>
            <head>
                <title>Calculation example</title>
            </head>
            <body>
                <h1>Calculation example</h1>
                <hr/>
                <table border="1" width="100%">
                    <tr style="background-color:lime">
                        <th>Title</th>
                        <th>Price</th>
                        <th>Quantity</th>
                        <th>Total</th>
                    </tr>
                    <xvcd:apply-templates select="sample:item"/>
                </table>
            </body>
        </html>
    </xvcd:template>

    <xvcd:template match="sample:item">
        <tr>
            <xvcd:apply-templates select="sample:title"/>
            <xvcd:apply-templates select="sample:price"/>
            <xvcd:apply-templates select="sample:quantity"/>
            <td>
                <xvcd:value-of select="number(sample:price)*number(sample:quantity)"/>
            </td>
        </tr>
    </xvcd:template>
	
    <xvcd:template match="sample:title">
        <td>
            <xvcd:text-of select="." filler="[** Title]"/>
        </td>
    </xvcd:template>
	
    <xvcd:template match="sample:price">
        <td>
            <xvcd:text-of select="." filler="[** Price]"/>
        </td>
    </xvcd:template>
	
    <xvcd:template match="sample:quantity">
        <td>
            <xvcd:text-of select="." filler="[** Quantity]"/>
        </td>
    </xvcd:template>
</xvcd:xvcd>

これで、XVCDを使用して数値を計算する最小限のボキャブラリコンポーネントの完成です。このボキャブラリコンポーネントは、sample:price要素とsample:quantity要素の内容をかけ算するだけのごく簡単なものです。

作成したXVCDは、Calculation.xvcdというファイル名で保存します。Calculation.xvcdは、Calculation.xmlと同じフォルダに保存します。

2.3. XVCDファイルの関連付け

続いて、Calculation.xmlCalculation.xvcdを関連付けます。 Calculation.xmlをテキストエディタで開き、次のように変更します。 強調文字で表記した箇所が、変更された箇所です。

<?xml version="1.0"?>

<?com.xfy vocabulary-connection href="Calculation.xvcd" ?>
<sample:items xmlns:sample="http://xmlns.xfy.com/sample/calculation"> 
    <sample:item> 
        <sample:title>リンゴ</sample:title> 
        <sample:price>100</sample:price> 
        <sample:quantity>10</sample:quantity> 
    </sample:item> 
    <sample:item> 
        <sample:title>ミカン</sample:title> 
        <sample:price>50</sample:price> 
        <sample:quantity>30</sample:quantity> 
    </sample:item> 
</sample:items>

Calculation.xmlを変更できたら、上書き保存してテキストエディタを終了します。

2.4. xfy Clientで表示

さっそく、xfy ClientでCalculation.xmlを表示してみましょう。

  1. xfy Clientを起動します
  2. [ファイル - 開く]を選択します
  3. Calculation.xmlを選択して、[開く]をクリックします

いかがですか、次の図のように表示されましたか?

XML文書内のデータを計算させ表示させる
XML文書内のデータを計算して表示

2.5. まとめ

ここで学んだことをまとめておきましょう。

  • XML文書内のデータの計算
    XML文書内のデータを計算するにはXPath式を記述します。ここでは、価格と数量のかけ算を行いました。
  • XPath関数
    XPath関数は出力するノード値を加工、演算するためのさまざまな機能を提供します。関数にはノードセット関数、文字列関数、 論理値関数、数値関数があります。ここでは、数値関数のnumber()を使用して文字列を数値に変換しました。

3. XML文書への計算結果の反映

「XVCDによる数値計算」では、xfyプラットフォームでXML文書内の数値を計算する方法について学びました。計算結果の表示だけならXSLTでもできるので、特におもしろいことはありません。ここでは、xfy technologyの特徴であるXML文書の編集と数値の計算とを関係させて、数値の計算結果を変換元となる編集対象XML文書に反映させてみましょう。

3.1. XML文書へ計算結果を反映させる方法

計算結果をあるノードの値として反映させるには、xfy technologyが提供する計算スクリプトを使用します。計算スクリプトとは、XML文書内で計算を行う仕組みです。XSLTが計算結果を表示するだけなのに対し、計算スクリプトを使ったXVCDは計算結果をXML文書のデータとして反映させることができます。

計算スクリプトには、3とおりの使い方があります。

  • 任意の要素の属性として埋め込んで使用する(属性埋め込み)
  • XML文書内へ計算スクリプトを埋め込む(XML文書への埋め込み)
  • XML文書内に処理命令を記述して、特定の計算スクリプトファイルをXML文書に割り当てる(外部ファイルの指定)

以下では、簡単な例題を使ってそれぞれの方法について説明します。

3.2. 属性埋め込み

属性埋め込みとは、計算スクリプトの calc:expression属性を任意の要素の属性として埋め込んで計算を行う方法です。calc:expression属性の値には、計算式を表すXPath式を記述します。それでは、属性埋め込みでボキャブラリコンポーネントを作成しましょう。

3.2.1. XML文書の定義

属性埋め込みでXML文書内のデータを計算できるようにするには、計算結果を反映させたい要素に calc:expression属性を記述するだけです。簡単ですね。

ここでは、サンプルのXML文書に計算結果を反映させるために、次の2つの要素を追加します。

  • sample:price要素とsample:quantity要素のかけ算をするために、sample:item要素の子要素としてsample:total要素を追加する
  • sample:total要素の合計を計算するために、sample:items要素の子要素としてsample:sum要素を追加する

また、sample:sum要素で合計を計算するときに、XPath関数のsum()を使用します。

まだXVCDファイルは作成していませんが、あらかじめこのXML文書に関連付けるXVCDファイルを指定しておきましょう。 これから作成するXVCDのファイル名は、Calculation2.xvcdとします。

Calculation.xmlをテキストエディタで開き、以下のように編集します。強調文字で表記した箇所が、変更された箇所です。また、計算スクリプトに関する記述が追加されたため、XML名前空間宣言xmlns:calc="http://xmlns.xfy.com/calc"が追加されていることに注意してください。

<?xml version="1.0"?>

<?com.xfy vocabulary-connection href="Calculation2.xvcd" ?>
<sample:items 
    xmlns:sample="http://xmlns.xfy.com/sample/calculation" 
    xmlns:calc="http://xmlns.xfy.com/calc"
    >
    <sample:item> 
        <sample:title>リンゴ</sample:title> 
        <sample:price>100</sample:price> 
        <sample:quantity>10</sample:quantity> 
        <sample:total calc:expression="number(../sample:price)*number(../sample:quantity)">
             0
        </sample:total> 
    </sample:item> 
    <sample:item> 
        <sample:title>ミカン</sample:title> 
        <sample:price>50</sample:price> 
        <sample:quantity>30</sample:quantity> 
        <sample:total calc:expression="number(../sample:price)*number(../sample:quantity)"> 
            0 
        </sample:total> 
    </sample:item> 
    <sample:sum calc:expression="sum(/sample:items/sample:item/sample:total)">
        0
    </sample:sum>
</sample:items>

編集が完了したら、Calculation2.xmlというファイル名で保存します。

3.2.2. XVCD定義

Calculation.xvcdをテキストエディタで開き、次のように編集します。強調文字で表記した箇所が、変更された箇所です。

<?xml version="1.0"?>

<xvcd:xvcd
    xmlns:xvcd="http://xmlns.xfy.com/xvcd" 
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:sample="http://xmlns.xfy.com/sample/calculation"
    version="1.0">

    <xvcd:vocabulary name="Calculation2" match="sample:items" call-template="root"/>

    <xvcd:template name="root">
        <html>
            <head>
                <title>Calculation example</title>
            </head>
            <body>
                <h1>Calculation example</h1>
                <hr/>
                <table border="1" width="100%">
                    <tr style="background-color:lime">
                        <th>Title</th>
                        <th>Price</th>
                        <th>Quantity</th>
                        <th>Total</th>
                    </tr>
                    <xvcd:apply-templates select="sample:item"/>
                </table>
                <hr /> 
                <p> 
                    TOTAL SUM = <xvcd:value-of select="sample:sum" /> 
                </p> 
            </body>
        </html>
    </xvcd:template>

    <xvcd:template match="sample:item">
        <tr>
            <xvcd:apply-templates select="sample:title"/>
            <xvcd:apply-templates select="sample:price"/>
            <xvcd:apply-templates select="sample:quantity"/>
            <xvcd:apply-templates select="sample:total"/>
        </tr>
    </xvcd:template>

    <xvcd:template match="sample:title">
        <td>
            <xvcd:text-of select="." filler="[** Title]"/>
        </td>
    </xvcd:template>

    <xvcd:template match="sample:price">
        <td>
            <xvcd:text-of select="." filler="[** Price]"/>
        </td>
    </xvcd:template>

    <xvcd:template match="sample:quantity">
        <td>
            <xvcd:text-of select="." filler="[** Quantity]"/>
        </td>
    </xvcd:template>

    <xvcd:template match="sample:total">
        <td>
            <xvcd:value-of select="."/>
        </td>
    </xvcd:template>

</xvcd:xvcd>

編集が完了したら、Calculation2.xvcdというファイル名で保存します。

3.2.3. xfy Clientで表示

さっそく、xfy ClientでCalculation2.xmlを表示してみましょう。

  1. xfy Clientを起動します
  2. [ファイル - 開く]を選択します
  3. Calculation2.xmlを選択して、[開く]をクリックします

いかがですか、次の図のように表示されましたか?

属性埋め込みによるXML文書データ計算
属性埋め込みによるXML文書内のデータの計算

3.2.4. まとめ

ここで学んだことをまとめておきましょう。

  • 計算スクリプト
    計算スクリプトとは、XML文書内で計算を行う仕組みです。XSLTが計算結果を表示するだけなのに対し、計算スクリプトを使ったXVCDは計算結果をXML文書のデータとして反映させることができます。
  • 属性埋め込み
    属性埋め込みとは、 calc:expression属性の値に計算スクリプトを記述し、任意の要素の属性として埋め込んで計算を行う方法です。属性埋め込みでXML文書内のデータを計算するには、計算結果を反映させたい要素にcalc:expression属性を記述します。

3.3. XML文書内への埋め込み

XML文書内への埋め込みとは、計算スクリプトをXML文書内に埋め込んで計算を行う方法です。ここでは、XML文書内への埋め込みでsample:price要素とsample:quantity要素のかけ算を行い、さらにsample:total要素の合計をsample:sum要素に反映させます。

3.3.1. XML文書の定義

XML文書内へ計算スクリプトを埋め込んで計算を行うには、 calc:calc要素com.xfy calculation処理命令をXML文書内に記述します。calc:calc要素のid属性には、calc:calc要素を識別する値を記述します。com.xfy calculation処理命令のhref属性には、埋め込み計算スクリプトを記述したcalc:calc要素のid属性に設定した値を、先頭に#を付けて記述します。今回は、com.xfy calculation処理命令のid属性の値をcalcとします。これらを大まかに記述したXML文書は、次のようになります。

<?xml version="1.0"?>

<?com.xfy calculation href="#calc"?>
<!-- id値の前に#を付ける -->

<sample:items>
    <calc:calc id="calc" version="1.0"> 
       ....
    </calc:calc> 
    ....
</sample:items>

calc:calc要素のversion属性には計算スクリプトのバージョンを記述します。現在提供されている計算スクリプトのバージョンは1.0です。そのため、version属性の値には「 1.0 」を設定します。

calc:calc要素の内容には、 calc:bind要素を記述します。calc:bind要素のそれぞれの属性には、次の値を記述します。

target属性
計算結果の出力先に指定するノード
expression属性
XPath式で表された計算式

ここでは、計算結果の出力先のノードはsample:total要素とsample:sum要素なので、計算スクリプトは次のようになります。

<calc:calc id="calc" version="1.0"> 
  <calc:bind
        target="/sample:items/sample:item/sample:total"
        expression="number(../sample:price)*number(../sample:quantity)" />
    <calc:bind
        target="/sample:items/sample:sum"
        expression="sum(/sample:items/sample:item/sample:total)" />
</calc:calc> 

ここまでの内容を反映したXML文書は、次のようになります。強調文字で表記した箇所が、変更された箇所です。

<?xml version="1.0"?>

<?com.xfy vocabulary-connection href="Calculation2.xvcd" ?>
<?com.xfy calculation href="#calc"?>
<sample:items
    xmlns:calc="http://xmlns.xfy.com/calc"
    xmlns:sample="http://xmlns.xfy.com/sample/calculation"
    > 
    <calc:calc id="calc" version="1.0"> 
       <calc:bind
          target="/sample:items/sample:item/sample:total"
          expression="number(../sample:price)*number(../sample:quantity)" />
        <calc:bind
            target="/sample:items/sample:sum"
            expression="sum(/sample:items/sample:item/sample:total)" />
    </calc:calc>
    <sample:item>
        <sample:title>リンゴ</sample:title> 
        <sample:price>100</sample:price> 
        <sample:quantity>10</sample:quantity> 
        <sample:total>
            0
        </sample:total> 
    </sample:item> 
    <sample:item> 
        <sample:title>ミカン</sample:title> 
        <sample:price>50</sample:price> 
        <sample:quantity>30</sample:quantity> 
        <sample:total>
            0
        </sample:total> 
    </sample:item> 
    <sample:sum>0</sample:sum> 
</sample:items>

編集が完了したら、Calculation3.xmlというファイル名で、Calculation2.xvcdと同じフォルダに保存します。

3.3.2. xfy Clientで表示

さっそく、xfy ClientでCalculation3.xmlを表示してみましょう。

  1. xfy Clientを起動します
  2. [ファイル - 開く]を選択します
  3. Calculation3.xmlを選択して、[開く]をクリックします

いかがですか、次の図のように表示されましたか?

計算スクリプトをXML文書内に埋め込んで計算をする
計算スクリプトをXML文書内に埋め込んだ計算

3.3.3. まとめ

ここで学んだことをまとめておきましょう。

  • XML文書への埋め込み
    XML文書内への埋め込みとは、計算スクリプトをXML文書内に埋め込んで計算を行う方法です。XML文書内へ計算スクリプトを埋め込んで計算を行うには、 calc:calc要素をXML文書内に記述します。
  • com.xfy calculation処理命令
    XML文書へ埋め込んだ計算スクリプトを処理するには、com.xfy calculation処理命令を記述します。com.xfy calculation処理命令のhref属性には、calc:calc要素のid属性に設定した値を、先頭に#を付けて指定します。

3.4. 外部ファイルの指定

外部ファイルの指定とは、別ファイルに記述した計算スクリプトをXML文書に取り込み、計算を行う方法です。ここでは、「XML文書内への埋め込み」で作成した計算スクリプトを別ファイルに記述します。具体的には、sample:total要素の合計値を求める計算スクリプトを、外部の計算スクリプトファイルに記述します。

3.4.1. 計算スクリプトファイルの定義

まず、XML文書に取り込む計算スクリプトファイルを用意します。 ここでは、「XML文書内への埋め込み」で作成した計算スクリプトを作成します。

<calc:calc id="calc" version="1.0" 
    xmlns:sample="http://xmlns.xfy.com/sample/calculation" 
    xmlns:calc="http://xmlns.xfy.com/calc"
    > 
    <calc:bind
        target="/sample:items/sample:item/sample:total"
        expression="number(../sample:price)*number(../sample:quantity)" /> 
    <calc:bind
        target="/sample:items/sample:sum"
        expression="sum(/sample:items/sample:item/sample:total)" /> 
</calc:calc> 

計算スクリプトの内容は、いままでに学習した内容を使用しているので、説明は省略します。計算スクリプトファイルの拡張子は、.calcです。

計算スクリプトを作成できたら、Calculation.calcというファイル名で適切なフォルダに保存します。

3.4.2. XML文書の定義

次に、計算スクリプトファイルを取り込むXML文書にcom.xfy calculation処理命令を記述します。com.xfy calculation処理命令のhref属性には、計算スクリプトファイルのURLを指定します。

ここでは、同じフォルダにXML文書と計算スクリプトファイルを保存するので、XML文書の定義は次のようになります。強調文字で表記した箇所が、変更された箇所です。

<?xml version="1.0"?>

<?com.xfy vocabulary-connection href="Calculation2.xvcd" ?>
<?com.xfy calculation href="Calculation.calc"?>
<sample:items
    xmlns:calc="http://xmlns.xfy.com/calc"
    xmlns:sample="http://xmlns.xfy.com/sample/calculation"
    > 
    <sample:sum>0</sample:sum> 
    <sample:item> 
        <sample:title>リンゴ</sample:title> 
        <sample:price>100</sample:price> 
        <sample:quantity>10</sample:quantity> 
        <sample:total>0</sample:total> 
    </sample:item> 
    <sample:item> 
        <sample:title>ミカン</sample:title> 
        <sample:price>50</sample:price> 
        <sample:quantity>30</sample:quantity> 
        <sample:total>0</sample:total> 
    </sample:item> 
</sample:items>

編集が完了したら、Calculation4.xmlというファイル名で、Calculation2.xvcdと同じフォルダに保存します。

3.4.3. xfy Clientで表示

さっそく、xfy ClientでCalculation4.xmlを表示してみましょう。

  1. xfy Clientを起動します
  2. [ファイル - 開く]を選択します
  3. Calculation4.xmlを選択して、[開く]をクリックします

いかがですか、次の図のように表示されましたか?

別ファイルに記述した計算スクリプトを取り込む
別ファイルに記述した計算スクリプトを取り込んで計算

3.4.4. まとめ

ここで学んだことをまとめておきましょう。

  • 外部ファイルの指定
    外部ファイルの指定とは、別ファイルに記述した計算スクリプトをXML文書に取り込み、計算を行う方法です。計算スクリプトを計算スクリプトファイルに記述します。
  • 計算スクリプトファイル
    計算スクリプトファイルには、計算スクリプトを記述します。拡張子は、.calcです。
  • com.xfy calculation処理命令による計算スクリプトの取り込み
    計算スクリプトファイルに記述した計算スクリプトをXML文書内に取り込むには、com.xfy calculation処理命令に計算スクリプトファイルのURLを記述します。