xmlstarletの両方の兄弟の合計値は何ですか?

xmlstarletの両方の兄弟の合計値は何ですか?

私はこれを使用して、xmlstarlet以前の兄弟イベントがある要素からテキストを抽出します。 XMLファイルの例:

 <event type='cue' units='sec'>
    <onset>11.134</onset>
    <duration>0.2</duration>
    <value name='side'>CUER</value>
  </event>
  <event type='target' units='sec'>
    <onset>11.367</onset>
    <duration>1.26</duration>
    <value name='side'>TARGETR</value>
    <value name='RT' units='msec'>379</value>
    <value name='TargCorr'>1</value>
    <value name='feedback'>YOU WIN!</value>
  </event>
  <event type='anticipation' units='sec'>
    <onset>12.651</onset>
    <duration>2.65</duration>
    <value name='TargCorr'>1</value>
    <value name='feedback'>YOU WIN!</value>
  </event>

この例では、次のことを行う必要があります。

  1. 印刷されてonset<event type='target'
  2. duration次の合計を印刷してください。<event type='target'duration<event type='anticipation'

onset次のオプションを使用すると、"preceding-sibling"正しい内容を印刷できます。

xmlstarlet sel -t \
 -m '//event[@type="anticipation" and value[@name="feedback"]="YOU WIN!"]' \
 -m 'preceding-sibling::event[@type="target" and value[@name="feedback"]="YOU WIN!"][1] ' \
 -v 'onset' -o ' ' -v 'duration' -o ' ' -o '1' -n $DIR/$xml \
   > $DIR/output.stf

前述のように、次のコードは2つの隣接するイベントの期間を合計するのではなく、一致する要素の期間のみを表示します。後者にxmlstarletを使用できますか?

ご協力ありがとうございます!

答え1

私は詳細を見ずに答えた。パスワード前の説明と一致しないため、コンテンツを提供しました。

onset属性が value の各ノードの値を検索するとします。eventこれを達成するためにwithを使用できます。typetargetxmlstarlet

xmlstarlet select --template \
    --value-of '//event[@type = "target"]/onset' \
    -nl file

これを作成する別の方法は、必要な一連のノードを一致させ、onset順番に各ノードから値を抽出することです。効果的には、次の一致するノードに移動する前に単一ノードで複数のタスクを実行する方法を紹介します。

xmlstarlet select --template \
    --match '//event[@type = "target"]' \
    --value-of 'onset' \
    -nl file

following-sibling「後続の兄弟ノード」はセレクタによって提供され、後続の兄弟ノードの最初のノードを使用して属性値を取得します。eventtypeanticipationfollowing-sibling::event[@type = "anticipation"][1]

duration一致するノードとその兄弟の値の追加は、sum()次のように上記のコマンドと組み合わせて行われます。

xmlstarlet select --template \
    --match '//event[@type = "target"]' \
    --value-of 'onset' --output ' ' \
    --value-of 'sum(duration | following-sibling::event[@type = "anticipation"][1]/duration)' \
    -nl file 

または短いオプションを使用してください。

xmlstarlet select -t \
    -m '//event[@type = "target"]' \
    -v 'onset' -o ' ' \
    -v 'sum(duration | following-sibling::event[@type = "anticipation"][1]/duration)' \
    -n file 

関数のノードセットを生成する構文を参照してくださいsum()。合計されたノードのセットを|区切られたXPathクエリと一致させます。

質問のサンプルデータが与えられたら、ラッパールートノードを追加すると、次のような結果が出力されます。

11.367 3.91

...ここで、最初の数字はノードonsetの数字、2番目の数字はそのノードに関連付けられている兄弟ノード値の合計です。targetdurationtargetanticipation

関連情報