Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 8 additions & 5 deletions packtools/sps/formats/pdf/pipeline/xml.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,11 +109,14 @@ def extract_contrib_data(xml_tree):
affiliations = []
corresponding_author = ''

contrib_group = xml_tree.find('.//contrib-group')
article_meta = xml_tree.find('./front/article-meta')
metadata_scope = article_meta if article_meta is not None else xml_tree
contrib_group = metadata_scope.find('.//contrib-group')
if contrib_group is not None:
aff_mapping = {}
affs = metadata_scope.findall('.//aff')

for aff in xml_tree.findall('.//aff'):
for aff in affs:
aff_id = aff.get('id')
label = aff.find('label').text if aff.find('label') is not None else ''
institution = aff.find('institution[@content-type="original"]')
Expand All @@ -140,12 +143,12 @@ def extract_contrib_data(xml_tree):
full_name += label
full_name += corresp_mark
authors_names.append(full_name)
for aff in xml_tree.findall('.//aff'):

for aff in affs:
label = aff.find('label').text if aff.find('label') is not None else ''
institution = aff.find('institution[@content-type="original"]')
institution_name = institution.text if institution is not None else ''

if institution_name:
aff_info = f"{label}[^] {institution_name}"
affiliations.append(aff_info)
Expand Down
115 changes: 115 additions & 0 deletions tests/sps/formats/pdf/pipeline/test_xml.py
Original file line number Diff line number Diff line change
Expand Up @@ -644,6 +644,121 @@ def test_extract_contrib_data_missing_label(self):
self.assertEqual(result['authors_names'], ['John Smith[^]'])
self.assertEqual(result['affiliations'], ['[^] University X'])

def test_subarticle_affiliation_is_not_printed(self):
# Regression: translated affiliations in a sub-article must not be
# included in the affiliation list of the main article.
xml = etree.fromstring("""
<article>
<front>
<article-meta>
<contrib-group>
<contrib>
<name>
<surname>Smith</surname>
<given-names>John</given-names>
</name>
<xref ref-type="aff" rid="aff1"/>
</contrib>
</contrib-group>
<aff id="aff1">
<label>I</label>
<institution content-type="original">University A</institution>
</aff>
</article-meta>
</front>
<sub-article article-type="translation">
<front-stub>
<contrib-group>
<contrib>
<name>
<surname>Smith</surname>
<given-names>John</given-names>
</name>
<xref ref-type="aff" rid="aff1e"/>
</contrib>
</contrib-group>
<aff id="aff1e">
<label>I</label>
<institution content-type="original">Universidade A</institution>
</aff>
</front-stub>
</sub-article>
</article>
""")
result = xml_pipe.extract_contrib_data(xml)
self.assertEqual(result['affiliations'], ['I[^] University A'])

def test_main_article_affiliations_are_kept_regardless_of_id_pattern(self):
xml = etree.fromstring("""
<article>
<front>
<article-meta>
<contrib-group>
<contrib>
<name>
<surname>Smith</surname>
<given-names>John</given-names>
</name>
<xref ref-type="aff" rid="aff01"/>
</contrib>
<contrib>
<name>
<surname>Doe</surname>
<given-names>Jane</given-names>
</name>
<xref ref-type="aff" rid="aff0100"/>
</contrib>
</contrib-group>
<aff id="aff01">
<label>1</label>
<institution content-type="original">University A</institution>
</aff>
<aff id="aff0100">
<label>2</label>
<institution content-type="original">University B</institution>
</aff>
</article-meta>
</front>
</article>
""")
result = xml_pipe.extract_contrib_data(xml)
self.assertEqual(
result['affiliations'],
['1[^] University A', '2[^] University B'],
)

def test_main_article_affiliation_without_xref_is_printed(self):
xml = etree.fromstring("""
<article>
<front>
<article-meta>
<contrib-group>
<contrib>
<name>
<surname>Smith</surname>
<given-names>John</given-names>
</name>
</contrib>
</contrib-group>
<aff id="aff1">
<label>1</label>
<institution content-type="original">University A</institution>
</aff>
</article-meta>
</front>
<sub-article article-type="translation">
<front-stub>
<aff id="aff1e">
<label>1</label>
<institution content-type="original">Universidade A</institution>
</aff>
</front-stub>
</sub-article>
</article>
""")
result = xml_pipe.extract_contrib_data(xml)
self.assertEqual(result['affiliations'], ['1[^] University A'])


class TestExtractDOI(unittest.TestCase):

Expand Down