0

次の 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 レコードを参照して返す方法がわかりません。

アイデアはありますか?

ありがとう、グレッグ

4

1 に答える 1

0

実際にそこで雇用情報を検索しているときに、変数を照会し'**'て名前を付けると、誤解を招く可能性があります。personこのようなもの:

def x = list.person.collectEntries{ person ->
    [person.person_id_external.text(), person.employment_information.job_information.findAll{ ji ->
        ji.event.text() in ['H','R'] && ji.start_date.text() < .person.employment_information.start_date.text()}}
于 2015-05-06T09:24:26.837 に答える