7.19.4 くり返しファンクションとの連携
XPathファンクションとくり返しファンクションを組み合わせて使用する方法を説明します。
くり返しファンクションによって処理されるノードをXPathファンクションで指定する場合は,相対ロケーションパスで指定します。
- 参考
-
ロケーションパスには,相対ロケーションパスと絶対ロケーションパスがあります。
-
相対ロケーションパス
あるノード(カレントノードなど)を起点として対象のノードまでの経路を指定する方法です
-
絶対ロケーションパス
ルートノードから対象のノードまでの経路を指定する方法です。
ロケーションパスの詳細な仕様については,「XML Path Language (XPath) Version 1.0‐2 Location Paths」を参照してください。
-
(1) くり返しの基準パスが単純型ノードの場合
くり返しファンクションの基準パスが単純型ノードである場合,その単純型ノードの相対ロケーションパスは”.”になります。”.”は自分自身のノードを表します。”self::node()”と同義です。
次に指定例を示します。
上記の例では,”.”がくり返しファンクションで処理されるvalue1つを表現しています。この場合,「/InputData/value」の値が1番目から順番に「/OutputData/result」へ代入されます。
(2) くり返しの基準パスが複合型ノードの場合
くり返しファンクションの基準パスが複合型ノードである場合,その複合型ノードの相対ロケーションパスは”.”になります。複合型ノードの子ノードは,複合型ノードからの相対ロケーションパスで指定します。
次に指定例を示します。
上記の例では,くり返しファンクションの範囲内にあるdataの子ノードvalueを相対ロケーションパス”./value”で指定しています。この場合,「/InputDataList/data/value」の値が1番目から順番に「/OutputDataList/data/result」へ代入されます。
絶対ロケーションパスで指定した場合は,くり返しファンクションと連動した値の代入が行われません。
次に指定例を示します。
上記の例では,くり返しファンクションの範囲内にあるdataの子ノードvalueを絶対ロケーションパスで指定しているため,「/InputDataList/data/value」の1番目の値がくり返し代入されます。
(3) くり返しファンクションとの連携例
XPathファンクションとくり返しファンクションの連携例を次に示します。
(a) 出現位置を代入する
XPathのposition関数を使用することでくり返しファンクションで処理されるノードの出現位置を代入することができます。
次に指定例を示します。
上記の例では,くり返しファンクションで処理される「/InputData/value」の出現位置(”1”,”2”,…)が「/OutputData/data/position」へ代入されます。
(b) ノード数(くり返し回数)を代入する
XPathのlast関数を使用することでノード数(くり返し回数)を代入することができます。
次に指定例を示します。
上記の例では,くり返しファンクションで処理される「/InputData/value」のノード数が「/OutputData/data/count」へ代入されます。下記の入力データでは,”3”が代入されます。
上記の例において,last関数と同様の機能であるノード数取得ファンクションを使用した場合は,くり返しファンクションで処理される「/InputData/value」の一つ一つに対してノード数取得処理が実行されます。そのため,常に”1”が代入されます。
次に使用例を示します。
(c) くり返し範囲外のノード値を代入する
くり返しファンクションの範囲外にあるノードについて,相対ロケーションパスを使用することでくり返し処理と連動したノード値を代入することができます。
次に指定例を示します。
くり返し範囲外のノード値を代入する例
上記の例では,くり返しファンクションの範囲外にあるidを基準パスであるdataから相対ロケーションパス(”../id”)で指定しています。この場合,「/InputData/dataList/data」に対応した「/InputData/dataList/id」の値が変換先へ代入されます。
絶対ロケーションパスで指定した場合やマッピング線で代入した場合は,くり返し処理と連動しないため,「/InputData/dataList/id」の1番目の値が変換先へ代入されます。
(d) くり返し条件をXPath式で指定する
くり返しファンクションのノード条件にXPathファンクションを指定することで,任意のXPath式でくり返し処理を制御することができます。
次に指定例を示します。
くり返し条件をXPath式で指定する例
上記の例では,くり返しファンクションのノード条件にnot関数,およびpreceding※を使用することで,「/InputDataList/data/value」の中で重複している値は代入しないように制御しています。
- 注※
-
precedingは,コンテキストノードより文書順で前にあるノードをすべて選択する軸です。precedingの詳細な仕様については,「XML Path Language (XPath) Version 1.0‐2.2 Axes」を参照してください。