나는 이것을 사용하여 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
이전에 설명한 것처럼 다음 코드는 인접한 두 이벤트의 기간을 합산하는 대신 일치하는 요소의 기간만 표시합니다.후자에 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
의 숫자이고 두 번째 숫자는 해당 노드와 연관된 형제 노드 값의 합계 입니다.target
duration
target
anticipation