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

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

관련 정보