Выберите узел, используя XPATH 1.0 и xmlstarlet, содержащий определенный текст - PullRequest
0 голосов
/ 21 сентября 2019

Из приведенного ниже XML, который начинается как:

<?xml version="1.0" encoding="UTF-8"?><searchRetrieveResponse>
  <version>1.2</version>
  <numberOfRecords>1</numberOfRecords>
  <records>
    <record>
      <recordSchema>marcxml</recordSchema>
      <recordPacking>xml</recordPacking>
      <recordData>
        <record>
          <leader>01448cam a2200445Ia 4500</leader>
          <controlfield tag="001">9910650701858</controlfield>
          <controlfield tag="005">20181227054218.2</controlfield>
          <controlfield tag="008">930525s1941    nyu      b    001 0 eng d</controlfield>
          <datafield tag="035" ind1=" " ind2=" ">
            <subfield code="a">(OCoLC)28157672</subfield>
          </datafield>
          <datafield tag="035" ind1=" " ind2=" ">
            <subfield code="a">(OCoLC)ocm28157672</subfield>
          </datafield>
          <datafield tag="035" ind1=" " ind2=" ">
            <subfield code="a">(EXLNZ-01ALLIANCE_NETWORK)99153881770001451</subfield>
          </datafield>
          <datafield tag="040" ind1=" " ind2=" ">
            <subfield code="a">UTS</subfield>
            <subfield code="b">eng</subfield>
            <subfield code="c">UTS</subfield>

Мне нужно выбрать только текстовый узел в /searchRetrieveResponse/records/record/recordData/record/datafield[@tag="035"]/subfield[@code="a"], который содержит (EXLNZ-01ALLIANCE_NETWORK), используя xmlstarlet (XPATH 1.0), поэтому желаемым выводом является (EXLNZ-01ALLIANCE_NETWORK) 99153881770001451

Я пробовал много вариантов xmlstarlet sel -T -t -m '/searchRetrieveResponse/records/record/recordData/record/datafield[@tag="035"]/subfield[@code="a"][text()[contains(.,'ALLIANCE_NETWORK')]]' -v '.', но я продолжаю возвращать все 035 / подполе [@ code = "a"], а не только одно, которое я хочу.Что я делаю неправильно?Спасибо

1 Ответ

0 голосов
/ 21 сентября 2019

Разобрался - фильтр не настроен должным образом.Я отправляю сообщения только потому, что обнаружил соответствие узла неловким.

xmlstarlet sel -T -t -m '/searchRetrieveResponse/records/record/recordData/record/datafield[@tag="035"]/subfield[@code="a"][contains(text(), "ALLIANCE_NETWORK")]' -v '.'
...