複数のソースから XML データのマージ

www.altova.com すべてを展開/折りたたむ このトピックを印刷 前のページ 1つ上のレベル 次のページ

ホーム >  SPS ファイル: 構造 >

複数のソースから XML データのマージ

XSLT 2.0 または 3.0 SPS で使用される XSLT のバージョンとすることで、複数のソース XML ファイルから得られた XML データを組み合わせることができます。

 

通常、データのマージは ID のような共通したデータをベースに行われます。例えば、従業員 ID により識別される社内の従業員の詳細データ(例: 従業員の詳細情報、給与、出社日)が、複数の XML ファイルにまたがって保管されている場合、これら複数のファイル内に保管されているデータを、従業員 ID をキーとしてマージし、出力ドキュメントにて表示することができます。

 

メモ:Enterprise Edition では、複数のスキーマソースを含めることができ、パラメーター名を使うことで、対応するスキーマから得られた XML ノードを選択することができます(以下のサンプルを参照ください)。Professional ならびに Basic Edition では、XPath 2.0 の doc() 関数を使用することで、目的の XML ファイルと、そのファイル内にある XML ノードを選択することができます。XPath 2.0 の doc() 関数により、外部 XML ドキュメントのドキュメントルートへアクセスすることが可能になり、外部 XML ドキュメント内にあるノードコンテンツを出力に挿入することが可能になります。そのため、doc() 関数を使用する 自動計算 を使うことでも、XML データをマージすることができます(以下のサンプルを参照ください)。

 

サンプル

(マイ) ドキュメントフォルダー C:\Documents and Settings\<username>\My Documents\Altova\StyleVision2019\StyleVisionExamples には、 サンプル SPS ファイル (MergeData_2_Files.sps) が含まれており、異なるソース XML ファイルのマージの方法が説明されています。SPS は、架空の注文 (下にリストされる MergeOrder.xml) からデータを選択します。

 

<?xml version="1.0" encoding="UTF-8"?>

<Order xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="MergeOrder.xsd">

   <Item partNum="238-KK" quantity="3" shipDate="2000-01-07" comment="With no inclusions, please."/>

   <Item partNum="748-OT" quantity="1" shipDate="2000-02-14" comment="Valentine's day packaging."/>

   <Item partNum="229-OB" quantity="1" shipDate="1999-12-05"/>

   <Item partNum="833-AA" quantity="2" shipDate="1999-12-05" comment="Need this for the holidays!"/>

</Order>

 

このファイルの /Order/Item/@partNum 属性の値は他のファイル MergeArticles.xml に保管されているカタログから製品を注文するために使用されます (下のリストを参照してください)。

 

<?xml version="1.0" encoding="UTF-8"?>

<Articles xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="MergeArticles.xsd">

   <Article PartNum="833-AA">

      <ProductName>Lapis necklace</ProductName>

      <Price>99.95</Price>

   </Article>

   <Article PartNum="748-OT">

      <ProductName>Diamond heart</ProductName>

      <Price>248.90</Price>

   </Article>

   <Article PartNum="783-KL">

      <ProductName>Uncut diamond</ProductName>

      <Price>79.90</Price>

   </Article>

   <Article PartNum="238-KK">

      <ProductName>Amber ring</ProductName>

      <Price>89.90</Price>

   </Article>

   <Article PartNum="229-OB">

      <ProductName>Pearl necklace</ProductName>

      <Price>4879.00</Price>

   </Article>

   <Article PartNum="128-UL">

      <ProductName>Jade earring</ProductName>

      <Price>179.90</Price>

</Article>

 ...

</Articles>

 

/Order/Item テンプレート内に ユーザー定義テンプレート をセットアップすることで、注文されたパーツの番号により MergeArticles.xml ファイル内の対応する Article 要素が選択され、データのマージが行われます(以下のスクリーンショットを参照)。(/Order/Item コンテキスト内にある)XPath 条件式は $Articles//Article[@PartNum=current()/@partNum] となります。

 

MergeXMLData

 

このテンプレートにより、以下のスクリーンショットに示されるような出力が表示されます。

 

MergeXMLDataOutput

 

各アイテムの注文数 (quantity) が MergeOrder.xml から得られているのに対して、注文されたものの名前は MergeArticles.xml ファイルから得られていることに注目してください。ProductName ノードが /Articles/Article テンプレートのコンテキスト内にて選択されている点にも注目してください。

 

自動計算 を使用することにより、上で得られたものと同じ結果を得ることができます(以下のスクリーンショットを参照)。スキーマツリーウィンドウから quantity 属性をドラッグすることで、コンテンツとして作成します。その後、以下のスクリーンショットに示される様に自動計算を追加して、以下にある XPath 条件式をその自動計算に与えます。

 

MergeXMLDataAutoCalc

 

自動計算の XPath 条件式により、他のスキーマソースのパラメーターや doc() 関数を使用することで、目的のノードを選択することができます:

 

 $Articles//Article[@PartNum=current()/@partNum]/製品Name

 

または

 

 doc('MergeArticles.xml')//Article[@PartNum=current()/@partNum]/製品Name

 

上にある最初の XPath 条件式が(Enterprise Edition でのみ使用できる)別の XML スキーマを参照しているのに対して、2番目の条件式では(Professional ならびに Basic Edition でも使用することのできる)XPath 2.0 の doc() 関数を使用しています。

 

 

 


(C) 2019 Altova GmbH