16 import(
'lib.pkp.classes.filter.PersistableFilter');
24 parent::__construct($filterGroup);
35 return 'plugins.importexport.pubmed.filter.ArticlePubMedXmlFilter';
47 return 'article-galley=>pubmed-xml';
60 $implementation =
new DOMImplementation();
61 $dtd = $implementation->createDocumentType(
'ArticleSet',
'-//NLM//DTD PubMed 2.0//EN',
'http://www.ncbi.nlm.nih.gov/entrez/query/static/PubMed.dtd');
62 $doc = $implementation->createDocument(
'',
'', $dtd);
63 $doc->preserveWhiteSpace =
false;
64 $doc->formatOutput =
true;
70 $rootNode = $doc->createElement(
'ArticleSet');
71 foreach ($submissions as $submission) {
73 if (!$journal || $journal->getId() != $submission->getContextId()) {
74 $journal = $journalDao->getById($submission->getContextId());
76 $issue = $issueDao->getBySubmissionId($submission->getId(), $journal->getId());
78 $articleNode = $doc->createElement(
'Article');
79 $articleNode->appendChild($this->
createJournalNode($doc, $journal, $issue, $submission));
81 $publication = $submission->getCurrentPublication();
83 $locale = $publication->getData(
'locale');
84 if ($locale ==
'en_US') {
85 $articleNode->appendChild($doc->createElement(
'ArticleTitle'))->appendChild($doc->createTextNode($publication->getLocalizedTitle($locale)));
87 $articleNode->appendChild($doc->createElement(
'VernacularTitle'))->appendChild($doc->createTextNode($publication->getLocalizedTitle($locale)));
90 $startPage = $publication->getStartingPage();
91 $endPage = $publication->getEndingPage();
92 if (isset($startPage) && $startPage !==
'') {
94 $articleNode->appendChild($doc->createElement(
'FirstPage'))->appendChild($doc->createTextNode($startPage));
95 $articleNode->appendChild($doc->createElement(
'LastPage'))->appendChild($doc->createTextNode($endPage));
98 if ($doi = $publication->getStoredPubId(
'doi')) {
99 $doiNode = $doc->createElement(
'ELocationID');
100 $doiNode->appendChild($doc->createTextNode($doi));
101 $doiNode->setAttribute(
'EIdType',
'doi');
102 $articleNode->appendChild($doiNode);
107 $authorListNode = $doc->createElement(
'AuthorList');
108 foreach ((array) $publication->getData(
'authors') as $author) {
109 $authorListNode->appendChild($this->
generateAuthorNode($doc, $journal, $issue, $submission, $author));
111 $articleNode->appendChild($authorListNode);
113 if ($publication->getStoredPubId(
'publisher-id')) {
114 $articleIdListNode = $doc->createElement(
'ArticleIdList');
115 $articleIdNode = $doc->createElement(
'ArticleId');
116 $articleIdNode->appendChild($doc->createTextNode($publication->getStoredPubId(
'publisher-id')));
117 $articleIdNode->setAttribute(
'IdType',
'pii');
118 $articleIdListNode->appendChild($articleIdNode);
119 $articleNode->appendChild($articleIdListNode);
123 $historyNode = $doc->createElement(
'History');
124 $historyNode->appendChild($this->
generatePubDateDom($doc, $submission->getDateSubmitted(),
'received'));
127 $editDecisions = (array) $editDecisionDao->getEditorDecisions($submission->getId());
129 $editorDecision = array_pop($editDecisions);
130 }
while ($editorDecision && $editorDecision[
'decision'] != SUBMISSION_EDITOR_DECISION_ACCEPT);
132 if ($editorDecision) {
133 $historyNode->appendChild($this->
generatePubDateDom($doc, $editorDecision[
'dateDecided'],
'accepted'));
135 $articleNode->appendChild($historyNode);
140 $articleNode->appendChild($doc->createElement(
'Abstract'))->appendChild($doc->createTextNode($abstract));
143 $rootNode->appendChild($articleNode);
145 $doc->appendChild($rootNode);
157 $journalNode = $doc->createElement(
'Journal');
159 $publisherNameNode = $doc->createElement(
'PublisherName');
160 $publisherNameNode->appendChild($doc->createTextNode($journal->getData(
'publisherInstitution')));
161 $journalNode->appendChild($publisherNameNode);
163 $journalTitleNode = $doc->createElement(
'JournalTitle');
164 $journalTitleNode->appendChild($doc->createTextNode($journal->getName($journal->getPrimaryLocale())));
165 $journalNode->appendChild($journalTitleNode);
168 if ($journal->getData(
'printIssn') !=
'') $issn = $journal->getData(
'printIssn');
169 elseif ($journal->getData(
'issn') !=
'') $issn = $journal->getData(
'issn');
170 elseif ($journal->getData(
'onlineIssn') !=
'') $issn = $journal->getData(
'onlineIssn');
172 if ($issn !=
'') $journalNode->appendChild($doc->createElement(
'Issn', $issn));
174 if ($issue && $issue->getShowVolume()) $journalNode->appendChild($doc->createElement(
'Volume'))->appendChild($doc->createTextNode($issue->getVolume()));
175 if ($issue && $issue->getShowNumber()) $journalNode->appendChild($doc->createElement(
'Issue'))->appendChild($doc->createTextNode($issue->getNumber()));
177 $datePublished =
null;
178 if ($submission) $datePublished = $submission->getCurrentPublication()->getData(
'datePublished');
179 if (!$datePublished && $issue) $datePublished = $issue->getDatePublished();
180 if ($datePublished) {
181 $journalNode->appendChild($this->
generatePubDateDom($doc, $datePublished,
'epublish'));
197 $authorElement = $doc->createElement(
'Author');
199 if (empty($author->getLocalizedFamilyName())) {
200 $authorElement->appendChild($node = $doc->createElement(
'FirstName'));
201 $node->setAttribute(
'EmptyYN',
'Y');
202 $authorElement->appendChild($doc->createElement(
'LastName'))->appendChild($doc->createTextNode(ucfirst($author->getLocalizedGivenName())));
204 $authorElement->appendChild($doc->createElement(
'FirstName'))->appendChild($doc->createTextNode(ucfirst($author->getLocalizedGivenName())));
205 $authorElement->appendChild($doc->createElement(
'LastName'))->appendChild($doc->createTextNode(ucfirst($author->getLocalizedFamilyName())));
207 $authorElement->appendChild($doc->createElement(
'Affiliation'))->appendChild($doc->createTextNode($author->getLocalizedAffiliation() .
'. ' . $author->getEmail()));
209 return $authorElement;
220 $pubDateNode = $doc->createElement(
'PubDate');
221 $pubDateNode->setAttribute(
'PubStatus', $pubStatus);
223 $pubDateNode->appendChild($doc->createElement(
'Year', date(
'Y', strtotime($pubDate))));
224 $pubDateNode->appendChild($doc->createElement(
'Month', date(
'm', strtotime($pubDate))));
225 $pubDateNode->appendChild($doc->createElement(
'Day', date(
'd', strtotime($pubDate))));