このサイトをビューするために 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 つの方法により、集計関数を使用することができます:

 

sum 関数を使用します。この MapForce ビルトイン関数はライブラリウィンドウ内で使用することができます。

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

 

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

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

mf_map_summing-nodes1

コアライブラリの集計関数に関する情報に関しては core | 集計関数を参照してください。

 

ソリューション 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 にインポートする前に XSLT 1.0 を変換言語として選択してください。カスタム関数をインポートする準備が整いました。以下を行ってください:

 

1.ライブラリ ウィンドウのベースの ライブラリの追加/削除 ボタンをクリックします。ライブラリの管理ウィンドウが開かれます。

mf_manage_libraries_window_empty

2.以下の内の1つを行います:

 

(現在のマッピング内のスコープのみで) ローカル ライブラリとして関数をインポートする場合現在のマッピング名の下の 「追加」 ボタンをクリックします。

(プログラムレベルで) グローバル ライブラリとして関数をインポートする場合 グローバルライブラリのインポートの横の 「追加」 ボタンをクリックします。

 

メモ:ライブラリをローカルでインポートする場合、ライブラリファイルのパスをマッピングに対して相対的に設定することが可能です。グローバルにインポートされたライブラリでは、インポートされたライブラリへのパスは常に絶対的なパスです。

 

3.<マイ ドキュメント>\Altova\MapForce2020\MapForceExamples\Tutorial\Summing-nodes.xslt を参照して 「開く」をクリックします。新規のライブラリが追加されたことを通知するメッセージボックスが表示され、新規のライブラリがライブラリウィンドウに表示されます。

mf_map_summing-nodes1a

4.ライブラリから 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) 2020 Altova GmbH