Как разделить результаты XPath разделителем?

У меня есть XML-данные для многих научных публикаций, и я пытаюсь проанализировать данные в KNIME, чтобы извлечь нужные мне поля. Вот один из примеров: https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pmc&id=PMC4400176

Чтобы извлечь имена авторов, я использую следующий запрос XPath: /pmc-articleset/article/front/article-meta/contrib-group/contrib[@contrib-type="author"]

Однако это возвращает: BorisovaSvetlana A., KimHak Joong, PuXiaotao, LiuHung-wen*

Я хотел бы, чтобы фамилия и имя были разделены каким-либо разделителем, запятой/пробелом, а разные имена авторов были разделены точкой с запятой. Это возможно? Или есть лучший способ извлечь информацию по сравнению с тем, что я сейчас делаю, что позволило бы мне достичь идеального результата:

Borisova, Svetlana A.; Kim, Hak Joong; Pu, Xiaotao; Liu, Hung-wen*

[редактировать]

Текущий рабочий процесс KNIME:

введите здесь описание изображения

Пример текущего выхода:

введите здесь описание изображения

Я попытался вывести все имена авторов для всех публикаций в ячейку коллекции. (Если все имена выводятся в несколько столбцов, это приводит к созданию сотен столбцов, содержащих пропущенные значения. Я даже пытался добиться идеального вывода, используя несколько манипуляций со строками, но он все еще не так совершенен из-за некоторых имена авторов, имеющие несколько имен, имена через дефис или имена, содержащие специальные символы.) Ячейка коллекции объединяет все имена авторов с разделителем-запятой между именами каждого автора, но объединяет фамилии и имена. Я также могу выполнять на них те же вышеупомянутые манипуляции со строками, но все равно сталкиваюсь с теми же проблемами, что и упомянутые.

Если я разделю имена авторов на несколько строк, это создаст несколько строк для каждой статьи, из которых я не уверен, как добраться до моей конечной цели для каждой статьи.

введите здесь описание изображения

Конечная цель:

введите здесь описание изображения

Любые идеи о том, как решить эту проблему с авторами, будут высоко оценены!


person Zille    schedule 02.05.2019    source источник
comment
Можете ли вы опубликовать полное преобразование xsl, которое у вас есть? Я подозреваю, что у вас есть только один xpath, но если вы определили шаблон для соответствия каждому элементу «contrib contrib-type=author», вы могли бы отформатировать определенные значения элементов «фамилия» и «данное имя».   -  person emeraldjava    schedule 02.05.2019
comment
@emeraldjava У меня был один xpath, но, поскольку для нескольких публикаций есть несколько авторов, если я извлеку значение каждого элемента, то есть фамилию и имя, я получу столбец всех разных фамилий авторов и еще один столбец всех разные имена авторов, разделенные запятой.   -  person Zille    schedule 03.05.2019


Ответы (1)


В идеале вы должны сделать это в несколько шагов. Я бы сделал это следующим образом:

  1. Извлеките все элементы contrib и верните полученные «узлы» в виде строк (не в виде строк), используя XPath
  2. Извлеките surname, given-names и xref, используя другой узел XPath.
  3. Соедините их вместе, например. с помощью узла обработки строк
  4. Объедините все в одну строку, например. с помощью объединителя столбцов или GroupBy

[править] Вы можете найти полностью рабочий пример рабочего процесса в моем общедоступном пространстве NodePit:

https://nodepit.com/workflow/com.nodepit.space%2Fqqilihq%2Fpublic%2FStack_Overflow%2FStack_Overflow_how-to-separate-xpath-results-by-a-delimiter_55959662.knwf

рабочий процесс

[относительно вашего редактирования] Насколько я понимаю, ваша проблема сейчас заключается в том, что ваша таблица содержит более одной публикации, и узел GroupBy объединит их все в одну строку. Чтобы избежать этого, вы можете использовать узлы «Looping». Просто окружите описанную выше логику парой Начало цикла фрагмента и Конец цикла узел. Это позволяет обрабатывать каждый паблик «в изоляции».

person qqilihq    schedule 02.05.2019
comment
Спасибо большое! Я смог проследить это до шага 4. У меня есть тысячи публикаций, а также другие данные, которые я также извлекаю с помощью XPath, поэтому не уверен, что смогу объединить все в одну строку. Прямо сейчас мой рабочий процесс считывает файл, содержащий PMCID, использует API для вызова PubMed Central и получения данных XML для всех PMCID, а затем использует XPath для извлечения таких вещей, как DOI, название, автор, реферат и т. д. Некоторые из с другими извлеченными данными мне пришлось выполнить некоторые незначительные манипуляции со строками, но чистое извлечение авторов доставляет мне больше всего хлопот. - person Zille; 03.05.2019
comment
Моим идеальным результатом был бы файл Excel, содержащий одну строку для каждой публикации и один столбец для необходимой информации, например. DOI, авторы, аннотация и т. д. Хотелось бы услышать любые ваши мысли по этому поводу! Я попытался выделить каждого автора в несколько столбцов, используя манипуляции со строками для объединения столбцов, удаляя лишние ? из-за отсутствующих значений, дальнейшие манипуляции со строками для очистки, но это совсем не идеально, и некоторые манипуляции со строками были не так полезно, когда речь идет об авторах с несколькими именами, именами через дефис или именами со специальными символами. - person Zille; 03.05.2019
comment
@Zille Рад помочь, однако я не уверен, что у вас все еще есть проблемы. Не стесняйтесь редактировать исходный пост или создать новый со своей проблемой, и я посмотрю! - person qqilihq; 03.05.2019
comment
Отредактировано! Благодарю вас! - person Zille; 03.05.2019
comment
@Zille Я добавил несколько отзывов к вашему дополнению. Надеюсь, поможет! - person qqilihq; 04.05.2019
comment
Спасибо! Я не очень хорошо знаком с циклическими узлами, но попробую! Однако, насколько я понимаю, узлы объединения групп/столбцов объединяют все подряд, верно? Я бы хотел, чтобы были объединены только авторы, а не все остальные мои столбцы. Я предполагаю, что мне, возможно, придется просто сделать это в несколько шагов, где я сначала получаю и объединяю всех авторов, а затем добавляю остальные свои данные. - person Zille; 06.05.2019
comment
С тех пор я добавил узлы начала и конца цикла фрагмента, которые объединили фамилию и имя автора каждой публикации в отдельные строки. Я последовал за этим узлом GroupBy, чтобы объединить всех авторов публикации в одну строку. Теперь осталось только добавить обратно все мои другие необходимые данные. Большое спасибо за все ваши отзывы! - person Zille; 06.05.2019
comment
Я предполагаю, что моя проблема сейчас заключается в том, что я больше не могу видеть все другие данные XML, которые я проанализировал в моем первом узле XPath, заголовке, дате, аннотации и т. д. для каждой публикации. Есть ли способ сохранить всю эту информацию, продолжая использовать описанный выше рабочий процесс для манипулирования именем автора? - person Zille; 06.05.2019
comment
Да, это не должно быть проблемой. С помощью метода, который я описал выше (т.е. с использованием узлов «Цикл»). Я предполагаю, что они в настоящее время теряются в узле GroupBy? В этом случае либо (а) переместите их за GroupBy, либо (б) настройте узел GroupBy так, чтобы эти столбцы сохранялись. - person qqilihq; 07.05.2019
comment
Да, я думаю, что достиг желаемого результата со всей вашей помощью. Большое спасибо!! - person Zille; 07.05.2019