このサイトをビューするために JavaScript を有効化してください。

Altova MapForce 2020 Enterprise Edition

» このレベルの上のトピックは存在しません «

例: ノードの値の集計

スクロール ホーム トップ その他

このセクションではXML インスタンスドキュメント内にある複数のノードを処理し、その結果をターゲットアイテムにある単一のアイテムへマッピングする方法について記述します。この例で使用されるファイルは以下のとおりで、 具体的には、マッピングの目的は、ソース XML ファイル内の全ての製品の値段を計算し、出力 XML ファイルに単一の値として書き込むことです。この例で使用されるファイルは以下のとおりで、 <マイ ドキュメント>\Altova\MapForce2020\MapForceExamples\Tutorial\ フォルダーに収められています:

 

Summing-nodes.mfdマッピングファイル

input.xml — ソース XML ファイル

input.xsd — ソース XML スキーマ

output.xsd — ターゲット XML スキーマ

Summing-nodes.xslt個々のノードの合計を求める名前付きテンプレートを含んだ XSLT ファイル

 

以下の 2 つの方法により、集計関数を使用することができます:

 

core ライブラリの sum 集計関数を使用します。この関数は、ライブラリ ウィンドウ内で使用することができます  (次も参照してください: 関数と作業する)。

カスタム XSLT スタイルシートを MapForce にインポートします。

 

ソリューション 1: "sum" 集計関数の使用

sum 集計関数をマッピング内で使用するには、関数を ライブラリ ウィンドウからマッピングにドラッグします。ライブラリ ウィンドウ内で使用することのできる関数は、選択された XSLT 言語バージョン (XSLT 1 または XSLT 2)により異なります。次に、以下に表示されるように マッピング接続を作成します。

mf_map_summing-nodes1

 

core ライブラリの集計関数に関する更に詳しい情報は、次を参照してください: core | aggregate functions

 

 

ソリューション 2: カスタム XSLT スタイルシートの使用

上記のように、この例の目的は、ソース XML ファイル内の製品の Price フィールドを合計することです。この例の場合は、製品 A と B です。

 

<?xml version="1.0" encoding="UTF-8"?>
<Input xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="input.xsd">
  <Products>
    <Product>
        <Name>ProductA</Name>
        <Amount>10</Amount>
        <Price>5</Price>
    </Product>
    <Product>
        <Name>ProductB</Name>
        <Amount>5</Amount>
        <Price>20</Price>
    </Product>
  </Products>
</Input>

 

下のイメージ は、名前をつけられたテンプレート "Total" と 単一パラメーター string を使用するカスタム XSLT スタイルシートを表示しています。テンプレートは、 XML 入力ファイルを介して作動し、XPath 式 /Product/Price により取得された全ての値を合計します。

 

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
 
  <xsl:template match="*">
    <xsl:for-each select=".">
    <xsl:call-template name="Total">
        <xsl:with-param name="string" select="."/>
    </xsl:call-template>
    </xsl:for-each>
  </xsl:template>
     
  <xsl:template name="Total">
  <xsl:param name="string"/>
    <xsl:value-of select="sum($string/Product/Price)"/>
  </xsl:template>
</xsl:stylesheet>

 

メモ:XSLT 2.0 内のノードを合計するには、スタイルシートの宣言を version="2.0" に変更してください。

 

XSLT スタイルシートを MapForce にインポートする:

 

1.XSLT を変換言語として選択します。詳細に関しては、次を参照してください: 変換言語の選択.

2.ライブラリ ウィンドウから 「ライブラリの追加/削除」 をクリックします

3.「オプション」 ダイアログボックスから ライブラリ タブをクリックします。

4.「追加」 をクリックして <マイ ドキュメント>\Altova\MapForce2020\MapForceExamples\Tutorial\Summing-nodes.xslt を参照します。

5.新しく作成された "Summing-nodes" ライブラリから Total 関数をマッピングにドラッグし、下に表示されるとおりマッピング接続を描きます。

mf_map_summing-nodes2

 

マッピングの結果をプレビューするには、「出力」 タブをクリックします。2つの Price フィールドの合計が Total フィールドに表示されます。

 

<?xml version="1.0" encoding="UTF-8"?>
<Output xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="output.xsd">
  <Total>25</Total>
  <Product>
    <Name>ProductA</Name>
    <Amount>10</Amount>
    <Price>5</Price>
  </Product>
  <Product>
    <Name>ProductB</Name>
    <Amount>5</Amount>
    <Price>20</Price>
  </Product>
</Output>

(C) 2019 Altova GmbH