Разбор результатов curl из запроса PubMed и форматирование их в цитату

Это дополнительный вопрос к этот вопрос.

Та же идея: я извлекаю данные из PubMed как XML и использую curl для обработки этих результатов. Это позволяет мне собирать нужную мне информацию (список идентификаторов пабов) и использовать ее в качестве переменной для ДРУГОЙ очистки PubMed. $ Name в конечном итоге будет динамическим.

<?php
$name = 'white,theodore';
// Return xml data from PubMed based on author search name
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term='.$name.'[author]&retmode=xml&retmax=50');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_VERBOSE, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);

$output = curl_exec($ch);

curl_close($ch);

// Parse the results and concatenate into a string of Publication IDs
$xml=simplexml_load_string($output);
$idList = $xml->IdList;
$ids = "";
foreach($idList->children() as $id) {
$ids .= $id . ",";
}

// Plug that string of IDs into another PubMed search, this one returning XML data for Publication Summaries
$path = 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id='.$ids;

$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_URL, $path);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch2, CURLOPT_VERBOSE, 0);
curl_setopt($ch2, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch2, CURLOPT_AUTOREFERER, true);
curl_setopt($ch2, CURLOPT_MAXREDIRS, 10);
curl_setopt($ch2, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch2, CURLOPT_FRESH_CONNECT, 1);

$data = curl_exec($ch2);

curl_close($ch2);
// Parse those results and print only what is needed for Citation format
$cxml=simplexml_load_string($data);
foreach($cxml->children() as $docsum) {
foreach($docsum->children() as $item) {
foreach($item->children() as $details) {
if ((string) $details['Name'] === 'Author') {echo $details . "., ";}
}
if ((string) $item['Name'] === 'FullJournalName') { echo $item . ". "; }
if ((string) $item['Name'] === 'Title') { echo "<strong>" . $item . "</strong> "; }
if ((string) $item['Name'] === 'Volume') { echo "Vol." . $item . ", "; }
if ((string) $item['Name'] === 'Issue') { echo "Issue" . $item . ". "; }
if ((string) $item['Name'] === 'PubDate') { echo $item . ". "; }
foreach($item->children() as $details) {
if ((string) $details['Name'] === 'PubType') {echo $details . ", ";}
}
}
echo "</br></br>";
}

?>

Который возвращает следующие данные XML (это ОДИН результат).

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE eSummaryResult PUBLIC "-//NLM//DTD esummary v1 20041029//EN" "https://eutils.ncbi.nlm.nih.gov/eutils/dtd/20041029/esummary-v1.dtd">
<eSummaryResult>
<DocSum>
<Id>27431223</Id>
<Item Name="PubDate" Type="Date">2016 Oct</Item>
<Item Name="EPubDate" Type="Date">2016 Sep 23</Item>
<Item Name="Source" Type="String">Antimicrob Agents Chemother</Item>
<Item Name="AuthorList" Type="List">
<Item Name="Author" Type="String">Bhattacharya S</Item>
<Item Name="Author" Type="String">Sobel JD</Item>
<Item Name="Author" Type="String">White TC</Item>
</Item>
<Item Name="LastAuthor" Type="String">White TC</Item>
<Item Name="Title" Type="String">A Combination Fluorescence Assay Demonstrates Increased Efflux Pump Activity as a Resistance Mechanism in Azole-Resistant Vaginal Candida albicans Isolates.</Item>
<Item Name="Volume" Type="String">60</Item>
<Item Name="Issue" Type="String">10</Item>
<Item Name="Pages" Type="String">5858-66</Item>
<Item Name="LangList" Type="List">
<Item Name="Lang" Type="String">English</Item>
</Item>
<Item Name="NlmUniqueID" Type="String">0315061</Item>
<Item Name="ISSN" Type="String">0066-4804</Item>
<Item Name="ESSN" Type="String">1098-6596</Item>
<Item Name="PubTypeList" Type="List">
<Item Name="PubType" Type="String">Journal Article</Item>
</Item>
<Item Name="RecordStatus" Type="String">Unknown status</Item>
<Item Name="PubStatus" Type="String">epublish</Item>
<Item Name="ArticleIds" Type="List">
<Item Name="pubmed" Type="String">27431223</Item>
<Item Name="pii" Type="String">AAC.01252-16</Item>
<Item Name="doi" Type="String">10.1128/AAC.01252-16</Item>
<Item Name="pmc" Type="String">PMC5038269</Item>
<Item Name="rid" Type="String">27431223</Item>
<Item Name="eid" Type="String">27431223</Item>
<Item Name="pmcid" Type="String">pmc-id: PMC5038269;embargo-date: 2017/04/01;</Item>
</Item>
<Item Name="DOI" Type="String">10.1128/AAC.01252-16</Item>
<Item Name="History" Type="List">
<Item Name="received" Type="Date">2016/06/10 00:00</Item>
<Item Name="accepted" Type="Date">2016/07/12 00:00</Item>
<Item Name="pmc-release" Type="Date">2017/04/01 00:00</Item>
<Item Name="entrez" Type="Date">2016/07/20 06:00</Item>
<Item Name="pubmed" Type="Date">2016/07/20 06:00</Item>
<Item Name="medline" Type="Date">2016/07/20 06:00</Item>
</Item>
<Item Name="References" Type="List"></Item>
<Item Name="HasAbstract" Type="Integer">1</Item>
<Item Name="PmcRefCount" Type="Integer">0</Item>
<Item Name="FullJournalName" Type="String">Antimicrobial agents and chemotherapy</Item>
<Item Name="ELocationID" Type="String">doi: 10.1128/AAC.01252-16</Item>
<Item Name="SO" Type="String">2016 Oct;60(10):5858-66</Item>
</DocSum>

</eSummaryResult>
</br></br>

Что звучит так:

2016 окт. Бхаттачарья С., Собель Дж. Д., Белый ТК., Комбинация
Флуоресцентный анализ демонстрирует повышенную активность откачивающего насоса как
Механизм Резистентности в Азолеустойчивых Влагалищных Candida albicans
Изолятов. Том 60, Выпуск 10. Журнальная статья, Противомикробные средства и
химиотерапия.

  1. Заврел М., Белый Т.С., Важные с медицинской точки зрения грибы реагируют на азольные препараты: обновленная информация. Том 10, Выпуск8. Журнальная статья, обзор, будущее
    микробиология.

  2. Esquivel BD., Smith AR., Zavrel M., White TC., Азол, препарат, импортируемый в патогенный гриб Aspergillus fumigatus. Том 59, Выпуск 6.
    Журнальная статья, Противомикробные препараты и химиотерапия.

Апрель 2015 г. Achterman RR., Moyes DL., Thavaraj S., Smith AR., Blair KM.,
White TC., Naglik JR., Дерматофиты активируют кератиноциты кожи через
активация митоген-активируемой протеинкиназы и индукция иммунитета
ответы. Том.83, Выпуск4. Журнальная статья, Инфекция и иммунитет.

2015 г. 3 февраля. Ford CB., Funt JM., Abbey D., Issi L., Guiducci C.,
Мартинес Д.А., Делорей Т., Ли Б.Ю., Уайт Т.С., Куомо С., Рао Р.П., Берман
Дж., Томпсон Д.А., Регев А., Эволюция лекарственной устойчивости у
клинические изоляты Candida Albicans. Том 4, Выпуск. Статья журнала,
eLife.

2014 авг 1. White TC., Финдли К., Доусон Т.Л.-младший, Шейниус А.,
Boekhout T., Cuomo CA., Xu J., Saunders CW., Грибы на коже:
дерматофиты и малассеция. Том 4, Выпуск8. Журнальная статья, обзор,
Перспективы Cold Spring Harbor в медицине.

2014 Jan. Maguire SL., Wang C., Holland LM., Brunel F., Neuvéglise C.,
Никауд Ж.М., Заврел М., Белый Т.С., Вулф К.Х., Батлер Г., Цинковый палец
факторы транскрипции вытеснили белки SREBP в качестве основного стерола
регуляторы в процессе эволюции Saccharomycotina. Том 10, Выпуск1. журнал
Статья, PLoS генетика.

2013 ноябрь 15. Камполи П., Перлин Д.С., Кристоф А.С., Белый Т.К., Наполнитель
С.Г., Шеппард Д.К., Фармакокинетика позаконазола в эпителиальной области.
клетки и грибы: понимание потенциальных механизмов действия во время
лечение и профилактика. Том 208. Выпуск 10. Журнальная статья
Журнал инфекционных заболеваний.

2013 июл 8. Achterman RR., White TC., Dermatophytes. Том 23, выпуск 13.
Журнальная статья, Современная биология: CB.

И Т.П.

Это все прекрасно работает и дает цитаты только с теми данными, которые мне нужны, НО я не могу переупорядочить результаты, поэтому на первом месте стоит Author, на втором месте PubDate и т. Д. Я пробовал несколько вариантов, но я недостаточно знаком с любым из них и не могу взломать это.

Я попытался прикрепить таблицу стилей XSLT, но думаю, что это не работает, потому что я не выводил XML-файл. Может быть?

Я попытался использовать следующий XPath вместо блока SimpleXML внизу, чтобы вернуть цитаты, но получаю пустые результаты. Потому что все данные помечены как <Item>Я пытаюсь безуспешно использовать атрибуты имени.

$content = simplexml_load_string($data);
$results = $content->xpath('Item[@Name]');
foreach($results as $result) {
$title = $result->xpath('[@Name="Title"]');
// Make sure there's an author attribute
if($title) {
// because we have a list of elements even if there's one result
$items = $title[0]->attributes();
$title = $items['value'];
}
echo $results;
}

Я также пробовал DOMXPath и GetElementsByTagName безрезультатно.

По сути, я застрял. Я перепробовал множество вариантов каждого и получил так много ошибок, что чувствую, что летаю кругами. Кто-нибудь с большим опытом Xpath или XSLT есть идея?

2

Решение

Рассмотрим следующее чисто XSLT-решение (нет foreach необходим цикл, который обрабатывает переупорядочение вашего узла и даже окончательный вывод, так как XSLT может преобразовывать содержимое XML в текст (например, строку PHP) и, конечно, даже в HTML.

Оставьте весь вызов CURL таким, как есть, но замените вложенный foreach зацикливание. Ниже скрипт XSLT встроен в виде строки и требует PHP php_xsl в файле .ini включено расширение для доступа к встроенному в PHP процессору XSLT 1.0 (т. е. libxslt):

// ... same CURL call ...

// Parse those results and print only what is needed for Citation format
$cxml=simplexml_load_string($data);

$xslstr = '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="text"/>
<xsl:strip-space elements="*"/>

<xsl:template match="DocSum">
<xsl:if test="Item[@Name=\'AuthorList\' and .!=\'\']">
<xsl:for-each select="Item[@Name=\'AuthorList\' and .!=\'\']/*">
<xsl:value-of select="." />
<xsl:if test="position() != last()">
<xsl:text>, </xsl:text>
</xsl:if>
</xsl:for-each><xsl:text>. </xsl:text>
</xsl:if>

<xsl:if test="Item[@Name=\'FullJournalName\' and .!=\'\']">
<xsl:value-of select="concat(\'&lt;strong&gt;\', Item[@Name=\'FullJournalName\'],
\'&lt;/strong&gt;\')" />
<xsl:text>. </xsl:text>
</xsl:if>
<xsl:if test="Item[@Name=\'Title\' and .!=\'\']">
<xsl:value-of select="Item[@Name=\'Title\']" /><xsl:text>, </xsl:text>
</xsl:if>
<xsl:if test="Item[@Name=\'Volume\' and .!=\'\']">
<xsl:value-of select="Item[@Name=\'Volume\']" /><xsl:text>. </xsl:text>
</xsl:if>
<xsl:if test="Item[@Name=\'Issue\' and .!=\'\']">
<xsl:value-of select="Item[@Name=\'Issue\']" /><xsl:text>. </xsl:text>
</xsl:if>
<xsl:if test="Item[@Name=\'PubDate\' and .!=\'\']">
<xsl:value-of select="Item[@Name=\'PubDate\']" /><xsl:text>. </xsl:text>
</xsl:if>

<xsl:if test="Item[@Name=\'PubTypeList\' and .!=\'\']">
<xsl:for-each select="Item[@Name=\'PubTypeList\']/*">
<xsl:value-of select="." />
<xsl:if test="position() != last()">
<xsl:text>, </xsl:text>
</xsl:if>
</xsl:for-each><xsl:text>. </xsl:text>
</xsl:if>

<xsl:text>&lt;br&gt;&lt;br&gt;</xsl:text>
</xsl:template>
</xsl:stylesheet>';

$xsl=simplexml_load_string($xslstr);

// XSLT TRANSFORMATION
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl);
$newXML = $proc->transformToXML($cxml);

echo $newXML;

Выход

Выход цитат

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]