从PubMed查询中解析卷曲结果并将其格式化为引文

时间:2016-12-15 16:06:47

标签: php xslt curl xpath pubmed

这是this问题的后续问题。

同样的想法:我将PubMed中的数据作为XML提取并使用curl来处理这些结果。这允许我获取我需要的信息(酒吧ID列表)并将其用作另一个PubMed scrape的变量。 $ 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年10月Bhattacharya S.,Sobel JD。,White TC。,A Combination   荧光测定证明了增加的外排泵活性   抗唑类阴道白色念珠菌的耐药机制   隔离。第60卷,第10期。期刊文章,抗菌剂和   化疗。

     
      
  1. Zavrel M.,White TC。,医学上重要的真菌对唑类药物的反应:更新。第10卷,第8期。期刊文章,评论,未来   微生物学。

  2.   
  3. Esquivel BD。,Smith AR。,Zavrel M.,White TC。,Azole药物进入致病性真菌烟曲霉(Aspergillus fumigatus)。第59卷,第6期。   期刊论文,抗菌药物和化疗。

  4.         

    2015年4月Achterman RR。,Moyes DL。,Thavaraj S.,Smith AR。,Blair KM。,   White TC。,Naglik JR。,Dermatophytes通过激活皮肤角质形成细胞   丝裂素活化蛋白激酶信号传导和诱导免疫   响应。第83卷,第4期。期刊文章,感染和免疫。

         

    2015年2月3. Ford CB。,Funt JM。,Abbey D.,Issi L.,Guiducci C.,   Martinez DA。,Delorey T.,Li BY。,White TC。,Cuomo C.,Rao RP。,Berman   J.,Thompson DA。,Regev A.,耐药性的进化   临床分离的白色念珠菌。第四卷,问题。杂志文章,   网上生活。

         

    2014年8月1. White TC。,Findley K.,Dawson TL Jr.,Scheynius A.,   Boekhout T.,Cuomo CA.,Xu J.,Saunders CW。,皮肤上的真菌:   皮肤真菌和马拉色菌。第4卷,第8期。期刊文章,评论,   冷泉港医学观点。

         

    2014 Jan.Maguire SL。,Wang C.,Holland LM。,Brunel F.,NeuvégliseC。,   Nicaud JM。,Zavrel M.,White TC。,Wolfe KH。,Butler G.,Zinc finger   转录因子取代SREBP蛋白作为主要的固醇   在Saccharomycotina进化期间的监管者。第10卷,第1期。日志   文章,PLoS遗传学。

         

    2013年11月15日.Campoli P.,Perlin DS。,Kristof AS。,White TC。,Filler   SG。,Sheppard DC。,泊沙康唑在上皮细胞内的药代动力学   细胞和真菌:洞察潜在的作用机制   治疗和预防。第208卷,第10期。期刊文章,   传染病杂志。

         

    2013年7月8日.Achterman RR。,White TC。,Dermatophytes。 Vol.23,Issue13。   期刊文章,当前生物学:CB。

         

    ETC。

这一切都很好,并且仅仅根据我需要的数据生成引用但是我无法对结果进行重新排序,因此作者首先出现,PubDate排在最后,等等。我尝试了很多选项,但我对任何数据都不熟悉他们似乎无法破解它。

我已尝试附加XSLT样式表,但我认为这不起作用,因为我实际上并没有输出XML文件。可能?

我尝试使用以下XPath而不是底部的SimpleXML块来返回引用但仍然获得空白结果。由于所有数据都标记为<Item>,因此我尝试使用Name属性失败。

$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经验的人有想法吗?

1 个答案:

答案 0 :(得分:2)

考虑以下纯XSLT解决方案(不需要foreach循环),它处理您的节点重新排序甚至最终输出,因为XSLT可以将XML内容转换为文本(即PHP字符串),当然甚至是HTML。

保持整个CURL调用,但替换嵌套的foreach循环。 XSLT脚本下面嵌入了字符串,需要在.ini文件中启用PHP的php_xsl扩展名来访问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;

<强>输出

Citations Output