私はこれを使用して、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>
この例では、次のことを行う必要があります。
- 印刷されて
onset
<event type='target'
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を使用できます。type
target
xmlstarlet
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
「後続の兄弟ノード」はセレクタによって提供され、後続の兄弟ノードの最初のノードを使用して属性値を取得します。event
type
anticipation
following-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番目の数字はそのノードに関連付けられている兄弟ノード値の合計です。target
duration
target
anticipation