XMLStarlet: запрос для MARCXML

#xml #xml-namespaces #xmlstarlet

#xml #xml-пространства имен #xmlstarlet

Вопрос:

Для файла MARCXML задана следующая структура foo.xml:

 <record><header><identifier>myID001</identifier><datestamp>2020-10-12</datestamp></header><metadata><marcxml:collection xmlns:marcxml="http://www.loc.gov/MARC21/slim">
      <marcxml:record>
          <marcxml:datafield ind1=" " ind2=" " tag="084">
          <marcxml:subfield code="2">rvk</marcxml:subfield>
          <marcxml:subfield code="a">MG 98092</marcxml:subfield>
        </marcxml:datafield>
        <marcxml:datafield ind1=" " ind2=" " tag="084">
          <marcxml:subfield code="2">bk</marcxml:subfield>
          <marcxml:subfield code="a">89.52</marcxml:subfield>
        </marcxml:datafield>
        <marcxml:datafield ind1=" " ind2=" " tag="084">
          <marcxml:subfield code="2">ddc</marcxml:subfield>
          <marcxml:subfield code="a">320.9439</marcxml:subfield>
        </marcxml:datafield>
      </marcxml:record>
    </marcxml:collection>
    </metadata></record>
  

Я хотел бы извлечь только содержимое <marcxml:subfield code="a"> того места, где предыдущее поле <marcxml:subfield code="2"> содержит строку ‘bk’.

Таким образом, желаемый результат в этом примере будет: 89.52.

До сих пор я пытался

 xmlstarlet sel -N marcxml="http://www.loc.gov/MARC21/slim" -t -m "//marcxml:collection/marcxml:record/marcxml:datafield/marcxml:subfield[text()='bk']" -v '//marcxml:collection/marcxml:record/marcxml:datafield/marcxml:subfield[text()]' -nl foo.xml
  

что приводит к

rvk

MG 98092

bk

89.52

ddc

320.9439

Как это можно сделать с помощью XMLStarlet?

Комментарии:

1. Что-то неясно: все три <marcxml:subfield code="a"> соответствуют требованию, так почему только ожидаемый результат 89.52 ?

2. Я хотел бы выбрать в соответствии с определенными критериями в ‘<marcxml: код подполя =»a»>’: игнорировать, если содержащаяся строка не является ‘bk’.

3. Извините; пропустил это в вопросе. Смотрите ниже.

Ответ №1:

Попробуйте что-нибудь в этом роде:

 xmlstarlet sel -N marcxml="http://www.loc.gov/MARC21/slim" -t -v '//marcxml:subfield[@code="2"][text()="bk"]/following-sibling::marcxml:subfield[@code="a"]' -nl foo.xml