次の XML を使用して、Groovy (Gpath または Xpath) で左端の要素で選択を実行し、正しい親要素への参照を含める方法を誰か教えてもらえますか?
<CompoundEmployee>
<person>
<person_id_external>21554</person_id_external>
<employment_information>
<start_date>2014-02-27</start_date>
<job_information><end_date>2013-04-21</end_date><event>H</event><start_date>2012-09-28</start_date></job_information>
<job_information><end_date>2013-04-26</end_date><event>5</event><start_date>2013-04-22</start_date></job_information>
<job_information><end_date>9999-12-31</end_date><event>R</event><start_date>2014-02-27</start_date></job_information>
</employment_information>
</person>
<person>
<person_id_external>8265</person_id_external>
<employment_information>
<start_date>2000-10-02</start_date>
<job_information><end_date>2014-10-24</end_date><event>5</event><start_date>2014-05-22</start_date></job_information>
<job_information><end_date>2014-05-21</end_date><event>H</event><start_date>2000-10-02</start_date></job_information>
<job_information><end_date>9999-12-31</end_date><event>5</event><start_date>2014-10-25</start_date></job_information>
</employment_information>
</person>
<execution_timestamp>2015-05-05T08:17:51.000Z</execution_timestamp>
<version_id>1502P0</version_id>
</CompoundEmployee>
英語で書かれた選択ステートメントは次のとおりです。
「ジョブ情報レコードの開始日が雇用情報の開始日より前であり、かつジョブ情報イベント タイプが採用または再雇用のいずれかである」
クエリによって返される要素には、employment_information の person_id_external と job_information の start_date が含まれている必要があります。
これまで私は試しました.....
def xml = """ xml from above """
def list = new XmlSlurper().parseText(xml)
x = list.'**'.findAll { person ->
person.event.text() in ['H','R'] && person.start_date.text() < list.person.employment_information.start_date.text()
}
x.each { l -> println "Type -> ${l.event}, Start Date -> ${l.start_date}, End Date -> ${l.end_date}" }
これは、入力ファイルに 1 人しかいない場合はうまく機能しますが、複数の従業員がいる場合は、間違った "list.person.employment_information.start_date" が参照されているため、結果が正しくありません。つまり、親/子ノードが関連していません。
上記に基づく出力の例は次のとおりです。
タイプ -> H、開始日 -> 2012-09-28、終了日 -> 2013-04-21
タイプ -> R、開始日 -> 2014-02-27、終了日 -> 9999-12-31
タイプ -> H、開始日 -> 2000-10-02、終了日 -> 2014-05-21
実際には、1 行のみを返す必要があります。
タイプ -> H、開始日 -> 2012-09-28、終了日 -> 2013-04-21
ご覧のとおり、ほぼ完了していますが、論理的に正しい親の Employment_information レコードを参照して返す方法がわかりません。
アイデアはありますか?
ありがとう、グレッグ