Используйте xmlstarlet для выбора узлов, которые НЕ содержат указанный подузел c - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть тысячи записей, похожих на приведенную ниже

<holding>
  <holding_id>2225031160001858</holding_id>
  <record>
    <leader>00210cx a22200085 454500</leader>
    <controlfield tag="001">h38165-01alliance_ohsu</controlfield>
    <controlfield tag="004">b10145746-01alliance_ohsu</controlfield>
    <controlfield tag="005">20200417125900.0</controlfield>
    <controlfield tag="008">2004170u\\\\0\\\0001aaund0999999</controlfield>
    <datafield ind1="2" ind2=" " tag="852">
      <subfield code="b">OHSUMAIN</subfield>
      <subfield code="c">oldstorjrl</subfield>
    </datafield>
  </record>
</holding>

Мне нужно изменить datafield @ ind1 на "", где @ tag="852 "И не subfield с @ code="h" существует. В этом примере @ code="b" и @ code="c" существуют, но @ code="h" нет, поэтому я бы хотел изменить эту запись.

Я могу придумать способы достижения sh что мне нужно, используя программную логику c, но могу ли я использовать xmlstarlet напрямую, чтобы выбрать нужные узлы на основе отсутствия подузла?

Желаемый вывод из этой записи будет

<holding>
  <holding_id>2225031160001858</holding_id>
  <record>
    <leader>00210cx a22200085 454500</leader>
    <controlfield tag="001">h38165-01alliance_ohsu</controlfield>
    <controlfield tag="004">b10145746-01alliance_ohsu</controlfield>
    <controlfield tag="005">20200417125900.0</controlfield>
    <controlfield tag="008">2004170u\\\\0\\\0001aaund0999999</controlfield>
    <datafield ind1=" " ind2=" " tag="852">
      <subfield code="b">OHSUMAIN</subfield>
      <subfield code="c">oldstorjrl</subfield>
    </datafield>
  </record>
</holding>

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Не знаю, как я это пропустил, но все оказалось просто

xmlstarlet ed -u '/holding/record/datafield[@tag="852"][not(subfield[@code="h"])]/@ind1' -v ' '
0 голосов
/ 20 апреля 2020

Это выражение xpath должно выбрать правильный целевой узел:

"//datafield[@ind1][not(subfield[@code="h"])]"
...