nlm-core-rule-103 | information | NLM-3-0000 | JATS QA rules applying to the root element | Sanity Check - make sure Schematron rules are running. | report | /*[self::*:article] | . |
nlm-core-rule-291 | error | | JATS QA rules applying to the root element | Checks whether the package contains a Thumbs.db file which should be removed before delivery. | report | /*[self::*:article] | not(false()) and ( oupfn:doc-available(concat('../Assets/', 'Thumbs.db'), base-uri()) or oupfn:doc-available(concat('Assets/', 'Thumbs.db'), base-uri()) or oupfn:doc-available(concat('assets/', 'Thumbs.db'), base-uri()) or oupfn:doc-available(concat('media/', 'Thumbs.db'), base-uri()) or oupfn:doc-available(concat('pdf/', 'Thumbs.db'), base-uri()) or oupfn:doc-available(concat('supplementary%20files/', 'Thumbs.db'), base-uri()) or oupfn:doc-available(concat('cover/', 'Thumbs.db'), base-uri()) ) |
nlm-core-rule-1 | error | NLM-1-0001 | JATS and BITS QA rules applying to all elements | No element in BITS/JATS may be empty, with the following exceptions:
book-meta
book-page-count
book-part (only for chapters in a book skeleton)
book-word-count
break
col
edition (for a 1st edition only)
ext-link (to a DOI)
graphic
hr
inline-graphic
issue
label
media
mml:*
page-count
related-article
related-object
self-uri
styled-content (for breaks and prompts)
supplementary-material (for a reference to a cover image or MARC record)
td
uri
volume
x1 (although only white space content is allowed)
xref, when child of contrib or title
| report | *[not(tokenize(namespace-uri(/*),'/')[last()] = 'SCJATS-journalissue.xsd')] | not ( self::*:book-meta or self::*:book-page-count or self::*:book-part[@book-part-type eq 'chapter'] or self::*:book-word-count or self::*:break or self::*:col or self::*:edition[@designator = '1'] or self::*:ext-link[@ext-link-type='doi'] or self::*:graphic or self::*:hr or self::*:inline-graphic or self::*:issue or self::*:label or self::*:media or self::mml:* or self::*:page-count or self::*:related-article or self::*:related-object or self::*:self-uri or self::*:styled-content[@specific-use = ('breakAfter','prompt')] or self::*:supplementary-material[@content-type = ('cover','marc')] or self::*:td or self::*:uri or self::*:volume[ancestor::*:front] or self::*:x1[ not(string(.) = '') ] or self::*:xref[ parent::*:contrib or (parent::*:title and @ref-type = 'fn')] ) and count(child::*) = 0 and (normalize-space(string(.)) = '' or matches(.,'^\p{Z}*$')) |
nlm-core-rule-5 | error | | JATS and BITS QA rules applying to DOIs | DOIs should only contain the characters "a-z", "A-Z", "0-9" and "-._;()/". | assert | *[not(tokenize(namespace-uri(/*),'/')[last()] = 'SCJATS-journalissue.xsd')][@pub-id-type = 'doi'][not(parent::*:mixed-citation)] | *[@book-id-type = 'doi'] | *[@book-part-id-type = 'doi'] |
| oupfn:is-valid-doi-strict(string(.)) |
nlm-core-rule-4 | error | NLM-1-0004 | JATS and BITS QA rules applying to DOIs | DOIs must start "10.nnn/", where nnn is a number. | assert | *[not(tokenize(namespace-uri(/*),'/')[last()] = 'SCJATS-journalissue.xsd')][@pub-id-type = 'doi'] | *:related-article[@ext-link-type='doi']/@xlink:href | *[@book-id-type = 'doi'] | *[@book-part-id-type = 'doi'] | *:related-object[@document-id-type = 'doi']/@document-id | *:related-object[@source-id-type = 'doi']/@source-id | *:related-object[@object-id-type = 'doi']/@object-id |
| oupfn:is-valid-doi(string(.)) |
bits-core-rule-23 | error | | JATS and BITS QA rules applying to DOIs | DOIs must start "10.1093/" or one of the UPSO partner press prefixes. This rule checks against the PoolParty controlled vocabulary 'Publishers'. | assert | *[@book-id-type = 'doi'] | *[@book-part-id-type = 'doi'] |
| matches( text(), concat( '^(', string-join(document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'Publishers.rdf') )/rdf:RDF/rdf:Description/skos-publishers:has_doi_prefix/text(),'|'), ')/' ) ) |
bits-core-rule-24 | error | | JATS and BITS QA rules applying to DOIs | DOIs in OUP books must match the regular expression pattern "10.\d+/[a-zA-Z0-9]+}\.\d+\.\d+(v\d+|)". | assert | *[@book-id-type = 'doi'] | *[@book-part-id-type = 'doi'] |
| not( if (//*:book-meta/*:publisher/*:publisher-name[text() = 'Oxford University Press']) then true() else false() ) or matches( text(), '^10\.\d+/([a-z]+/|)[a-zA-Z0-9]+\.\d+\.\d+(v\d+|)$' ) |
bits-core-rule-38 | error | | JATS and BITS QA rules applying to DOIs | DOIs have a component after the ISBN that corresponds to the element it is applied to ("001" for "book", "002" for "front-matter-part", "003" for "book-part", "005" for "book-app"). | assert | *[@book-id-type = 'doi'] | *[@book-part-id-type = 'doi'] |
| exists(/comment()[matches(.,'Converted to\s+(SC|)BITS')]) or not( if (//*:book-meta/*:publisher/*:publisher-name[text() = 'Oxford University Press']) then true() else false() ) or (replace(text(), '^10\.\d+/([a-z]+/|)[a-zA-Z0-9]+\.(\d+)\.\d+(v\d+|)$', '$2') = '001' and local-name(parent::*/parent::*) = 'book') or (replace(text(), '^10\.\d+/([a-z]+/|)[a-zA-Z0-9]+\.(\d+)\.\d+(v\d+|)$', '$2') = '001' and local-name(parent::*/parent::*) = 'book-part-wrapper') or (replace(text(), '^10\.\d+/([a-z]+/|)[a-zA-Z0-9]+\.(\d+)\.\d+(v\d+|)$', '$2') = '002' and local-name(parent::*/parent::*) = 'front-matter-part') or (replace(text(), '^10\.\d+/([a-z]+/|)[a-zA-Z0-9]+\.(\d+)\.\d+(v\d+|)$', '$2') = '003' and local-name(parent::*/parent::*) = 'book-part') or (replace(text(), '^10\.\d+/([a-z]+/|)[a-zA-Z0-9]+\.(\d+)\.\d+(v\d+|)$', '$2') = '005' and local-name(parent::*/parent::*) = 'book-app') |
bits-core-rule-25 | error | | JATS and BITS QA rules applying to DOIs | DOIs must be unique. | report | *[@book-part-id-type = 'doi'] | text() = preceding::*[@book-id-type = 'doi' or @book-part-id-type = 'doi'] |
nlm-core-rule-309 | error | | JATS and BITS QA rules applying to specified content elements and attributes | MathML must not contain deprecated @fontsize, @fontweight, @fontstyle, @fontfamily, @color, @background attributes. | report | @fontsize|@fontstyle|@fontweight|@fontfamily|@color|@background | not(parent::mml:mglyph) |
nlm-core-rule-306 | error | | JATS and BITS QA rules applying to specified content elements and attributes | MathML length regex is defined in schema file common-types.xsd. | assert | @subscriptshift|@superscriptshift|mml:*/@height|mml:*/@depth|@scriptminsize|@veryverythinmathspace|@verythinmathspace|@thinmathspace|@mediummathspace|@thickmathspace|@verythickmathspace|@veryverythickmathspace|@minlabelspacing | matches(.,'^((-?([0-9]+|[0-9]*\.[0-9]+)*(em|ex|px|in|cm|mm|pt|pc|%))|0)$') |
nlm-core-rule-307 | error | | JATS and BITS QA rules applying to specified content elements and attributes | MathML length regex is defined in schema file common-types.xsd. Also uses values for "simple-size" | assert | @mathsize | matches(.,'^((-?([0-9]+|[0-9]*\.[0-9]+)*(em|ex|px|in|cm|mm|pt|pc|%))|0|small|normal|big)$') |
nlm-core-rule-213 | error | | JATS and BITS QA rules applying to specified content elements and attributes | Checks that @mathvariant attribute has valid value. This rule checks against the PoolParty controlled vocabulary 'MathMLFont'. | assert | @mathvariant | . = document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'MathMLFont.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)]/skos:prefLabel/text() |
nlm-core-rule-316 | error | | JATS and BITS QA rules applying to specified content elements and attributes | MathML @notation values are defined in MathML spec. | assert | mml:menclose/@notation | . = ( 'actuarial', 'longdiv', 'radical', 'box', 'roundedbox', 'circle', 'left', 'right', 'top', 'bottom', 'updiagonalstrike', 'downdiagonalstrike', 'verticalstrike', 'horizontalstrike' ) |
nlm-core-rule-308 | error | | JATS and BITS QA rules applying to specified content elements and attributes | MathML length regex is defined in schema file common-types.xsd. Also uses values for "named-space". | assert | mml:*/@width|mml:*/@lspace|mml:*/@rspace|mml:*/@minsize|mml:*/@maxsize | matches(.,'^((-?([0-9]+|[0-9]*\.[0-9]+)*(em|ex|px|in|cm|mm|pt|pc|%))|0|veryverythinmathspace|verythinmathspace|thinmathspace|mediummathspace|thickmathspace|verythickmathspace|veryverythickmathspace)$') |
nlm-core-rule-2 | error | NLM-1-0002 | JATS and BITS QA rules applying to specified content elements and attributes | @xlink:href must be non-empty. | assert | @xlink:href | normalize-space(string(.)) != '' |
nlm-core-rule-35 | error | NLM-1-0035 | JATS and BITS QA rules applying to specified content elements and attributes | Checks that @xlink:href value includes file extension. | report | @xlink:href | ( parent::*:supplementary-material or parent::*:inline-supplementary-material or parent::*:graphic or parent::*:inline-graphic or parent::*:media[not(@content-type='brightcove')]/parent::*:supplementary-material ) and not(//*:book-meta/*:custom-meta-group/*:custom-meta[*:meta-name/text() = 'is-proofing-stage']/*:meta-value/text()) and not( matches( ., '\.[^-_]{1,6}$' ) ) |
nlm-core-rule-202 | error | | JATS and BITS QA rules applying to specified content elements and attributes | Supplementary data filename is longer than SC depositor service can cope with. | report | @xlink:href | parent::*:supplementary-material and string-length() > 99 and not(//*:book-meta/*:custom-meta-group/*:custom-meta[*:meta-name/text() = 'is-proofing-stage']/*:meta-value/text()) |
nlm-core-rule-203 | error | | JATS QA rules applying to metadata | JATS and BITS QA rules applying to specified content elements and attributes |
| Checks that @xlink:href and article-id values do not begin or end with a space character. | assert | | . = normalize-space(.) |
nlm-core-rule-32 | error | NLM-1-0032 | JATS QA rules applying to metadata | JATS and BITS QA rules applying to metadata | JATS and BITS QA rules applying to specified content elements and attributes | BITS QA rules applying to specified content elements and attributes |
| Checks element has @id | assert | *:related-article | *:sec[parent::*:abstract] | *:corresp | *:supplementary-material[not(parent::*:issue-meta or parent::*:book-meta/parent::*:book-part-wrapper)] | *:ack | *:fn | mml:math | *:ref | *:ref-list | *:table-wrap | *:tex-math | *:ack | *:book-app | *:book-part | *:boxed-text | *:fig | *:fig-group | *:front-matter-part | *:index | *:index-group | *:ref-list | *:sec |
| exists(/comment()[matches(.,'Converted to\s+(SC|)BITS')]) or (exists(@id) and string(@id) ne '') |
nlm-core-rule-119 | error | | JATS and BITS QA rules applying to metadata | JATS and BITS QA rules applying to specified content elements and attributes | JATS QA rules applying to specified content elements and attributes |
| Checks that element has a title. Exception: abstract with @abstract-type of "teaser". | assert | *:abstract | *:ack | *:ref-list | *:sec[parent::*:abstract] |
| child::*:title or (self::*:abstract and @abstract-type = 'teaser') |
nlm-core-rule-302 | error | | JATS and BITS QA rules applying to specified content elements and attributes | alt-text element must have content that is not simply "null". | report | *:alt-text | empty(text()) or text() eq '' or lower-case(text()) eq 'null' |
nlm-core-rule-323 | error | | JATS and BITS QA rules applying to specified content elements and attributes | alt-text element must be a child of graphic. | assert | *:alt-text | parent::*:graphic or parent::*:inline-graphic or parent::*:supplementary-material[@content-type eq 'affiliate-logo'] |
nlm-core-rule-21 | error | NLM-1-0020 | JATS and BITS QA rules applying to specified content elements and attributes | BITS QA rules applying to specified content elements and attributes |
| back and book-back elements may not have a title or label child. | report | | child::*:title or child::*:label |
nlm-core-rule-96 | error | NLM-1-0100b | JATS and BITS QA rules applying to specified content elements and attributes | <inline-formula> and <disp-formula> must contain one of
<tex-math notation="LaTeX"> or <mml:math>, but not both. They may contain graphics where the code is not available. | assert | *:disp-formula | *:inline-formula |
| (child::*:tex-math[@notation = 'LaTeX'] or child::mml:math or child::*:inline-graphic or child::*:graphic) and count(child::*[not(self::*:label)]) = 1 and count(child::*:label) le 1 and count(child::*:inline-graphic) le 1 and count(child::*:graphic) le 1 |
nlm-core-rule-98 | error | | JATS and BITS QA rules applying to specified content elements and attributes | The inline-formula and disp-formula elements may not contain other inline-formula and disp-formula elements. | report | *:disp-formula | *:inline-formula |
| descendant::*:inline-formula or descendant::*:disp-formula |
nlm-core-rule-152 | error | | JATS and BITS QA rules applying to specified content elements and attributes | A figure. display formula or table-wrap element must not be a descendant of a paragraph element, unless it is part of a list or inside a footnote. | report | *:disp-formula | *:fig | *:table-wrap |
| ancestor::*:p and not( ancestor::*:statement or ancestor::*:list-item or ancestor::*:fn or ancestor::*:abstract ) |
nlm-core-rule-121 | error | | JATS and BITS QA rules applying to specified content elements and attributes | JATS QA rules applying to specified content elements and attributes |
| Flags if a deprecated element is used | report | *:element-citation | *:response |
| self::* |
nlm-core-rule-36 | error | NLM-1-0036 | JATS and BITS QA rules applying to specified content elements and attributes | Checks ext-link elements have the correct value of @ext-link-type. This rule checks against the PoolParty controlled vocabulary 'ExternalLinkType'. | assert | *:ext-link | @ext-link-type = document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'ExternalLinkType.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)]/skos:prefLabel/text() |
nlm-core-rule-155 | error | | JATS and BITS QA rules applying to specified content elements and attributes | Check that @xlink:href starts "http://" or "https://" for particular values of @ext-link-type | report | *:ext-link | ( @ext-link-type[ . = ('pmcid', 'pmid', 'uri') ] and not(matches(@xlink:href, '^https?://')) ) or ( @ext-link-type[ . = ('doi', 'orcid') ] and not(matches(@xlink:href, '^https://')) ) |
nlm-core-rule-173 | warning | | JATS and BITS QA rules applying to specified content elements and attributes | Checks for license element when book or journal article has a link to creativecommons.org | report | | (starts-with(@xlink:href,'http://creativecommons.org') or starts-with(@xlink:href,'https://creativecommons.org')) and not( if (/*:article/*:front/*:article-meta/*:permissions/*:license[starts-with(@license-type,'cc-')]) then true() else false() or if (//*:book-meta/*:permissions/*:license[starts-with(@license-type,'cc-')]) then true() else false() ) |
nlm-core-rule-283 | error | | JATS and BITS QA rules applying to specified content elements and attributes | BITS QA rules applying to specified content elements and attributes |
| A link may not contain another link. | report | *:ext-link | *:uri | *:xref | *:related-object |
| descendant::*:ext-link or descendant::*:related-object or descendant::*:uri or descendant::*:xref |
nlm-core-rule-321 | error | | JATS and BITS QA rules applying to metadata | JATS and BITS QA rules applying to specified content elements and attributes |
| Checks that author-notes does not have a direct child p, as this may cause the text to display within the Extract in the issue TOC. The p should be within a fn or corresp element. Now checks fig as well. | report | | .[child::*:p] |
nlm-core-rule-38 | error | NLM-1-0038 | JATS and BITS QA rules applying to specified content elements and attributes | @symbol attribute should not be used (use label element instead). | report | *:fn | @symbol |
nlm-core-rule-39 | error | NLM-1-0039 | JATS and BITS QA rules applying to specified content elements and attributes | Checks that table footnotes are in the table foot | report | *:fn | ancestor::*:table-wrap and not(parent::*:table-wrap-foot) |
nlm-core-rule-130 | error | | JATS QA rules applying to metadata | JATS and BITS QA rules applying to metadata | JATS and BITS QA rules applying to specified content elements and attributes |
| Flags if no xref or related-object is found which targets the aff, corresp, or fn element. | assert | | @id = //*:xref/@rid or @id = //*:related-object/@object-id or self::*:fn[parent::*:table-wrap-foot] or self::*:aff[parent::*:contrib] |
nlm-core-rule-139 | error | | JATS and BITS QA rules applying to specified content elements and attributes | Checks for presence of title "Footnotes" or "Endnotes" in fn-group. | assert | *:fn-group | child::*:title[. = 'Footnotes' or . = 'Endnotes' or . = 'Notes'] |
nlm-core-rule-194 | warning | | JATS and BITS QA rules applying to specified content elements and attributes | Checks for presence of title "Endnotes" in fn-group. This value may only be used with permission from OUP. | report | *:fn-group | child::*:title[ . = 'Endnotes'] |
nlm-core-rule-205 | error | | JATS and BITS QA rules applying to specified content elements and attributes | Parent of a fn-group element must be a back, ack, or toc element. | assert | *:fn-group | parent::*:back or parent::*:ack or parent::*:toc |
nlm-core-rule-144 | error | | JATS QA rules applying to metadata | JATS and BITS QA rules applying to metadata | JATS and BITS QA rules applying to specified content elements and attributes |
| Checks that file extension for supplementary material is on the allowed list. This rule checks against the PoolParty controlled vocabulary 'FileType'. | assert | *:supplementary-material[parent::*:issue-meta] | *:self-uri[not(parent::*:book-meta/parent::*:book-part-wrapper)] | *:supplementary-material[not(parent::*:issue-meta or parent::*:book-meta/parent::*:book-part-wrapper)] | *:graphic | *:inline-graphic |
| not(contains(@xlink:href,'.')) or ( ( self::*:supplementary-material and lower-case( replace(@xlink:href,'^.+\.([^\.]+)$','$1') ) = (document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'FileType.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)][child::skos:broader[@rdf:resource = 'http://data.oup.com/taxonomy/FileType/1']]/skos:prefLabel/text(),document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'FileType.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)][child::skos:broader[@rdf:resource = 'http://data.oup.com/taxonomy/FileType/23']]/skos:prefLabel/text()) ) or ( (self::*:graphic or self::*:inline-graphic) and lower-case( replace(@xlink:href,'^.+\.([^\.]+)$','$1') ) = document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'FileType.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)][child::skos:broader[@rdf:resource = 'http://data.oup.com/taxonomy/FileType/23']]/skos:prefLabel/text() ) or ( self::*:self-uri and lower-case( replace(@xlink:href,'^.+\.([^\.]+)$','$1') ) = 'pdf' ) ) |
nlm-core-rule-153 | error | | JATS QA rules applying to metadata | JATS and BITS QA rules applying to metadata | JATS and BITS QA rules applying to specified content elements and attributes |
| A file name for a PDF version of an article or a supplementary data file must not contain a space character. | report | *:supplementary-material[parent::*:issue-meta] | *:self-uri[not(parent::*:book-meta/parent::*:book-part-wrapper)] | *:supplementary-material[not(parent::*:issue-meta or parent::*:book-meta/parent::*:book-part-wrapper)] | *:graphic | *:inline-graphic | *:media |
| contains(@xlink:href,' ') |
nlm-core-rule-169 | fatal-error | | JATS QA rules applying to metadata | JATS and BITS QA rules applying to metadata | JATS and BITS QA rules applying to specified content elements and attributes |
| Checks that files referenced exist on the filesystem. | report | *:supplementary-material[parent::*:issue-meta] | *:self-uri[not(parent::*:book-meta/parent::*:book-part-wrapper)] | *:supplementary-material[not(parent::*:issue-meta or parent::*:book-meta/parent::*:book-part-wrapper)] | *:graphic | *:inline-graphic |
| not( false() or //*:book-meta/*:custom-meta-group/*:custom-meta[*:meta-name/text() = 'is-proofing-stage']/*:meta-value/text() or oupfn:doc-available(concat('../Assets/', @xlink:href), base-uri()) or oupfn:doc-available(concat('Assets/', @xlink:href), base-uri()) or oupfn:doc-available(concat('assets/', @xlink:href), base-uri()) or oupfn:doc-available(concat('media/', @xlink:href), base-uri()) or oupfn:doc-available(concat('pdf/', @xlink:href), base-uri()) or oupfn:doc-available(concat('supplementary%20files/', @xlink:href), base-uri()) or oupfn:doc-available(concat('../issue_level_files/', @xlink:href), base-uri()) or oupfn:doc-available(concat('cover/', @xlink:href), base-uri()) or oupfn:doc-available(concat('chunked%20pdf/', @xlink:href), base-uri()) or oupfn:doc-available(concat('print%20pdf/', @xlink:href), base-uri()) or oupfn:doc-available(concat('print/', @xlink:href), base-uri()) or oupfn:doc-available(concat('figures/inline/', @xlink:href), base-uri()) or oupfn:doc-available(concat('q&a/', @xlink:href), base-uri()) or oupfn:doc-available(concat('ebook/', @xlink:href), base-uri()) or oupfn:doc-available(concat('MARC/', @xlink:href), base-uri()) or @xlink:href = tokenize(string(''),',\s*') ) |
nlm-core-rule-256 | error | | JATS and BITS QA rules applying to specified content elements and attributes | @mimetype attribute of graphic or inline-graphic must have value "image". This rule checks against the PoolParty controlled vocabulary 'MIMEType'. | assert | *:graphic | *:inline-graphic |
| @mimetype = document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'MIMEType.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)][child::skos:broader[@rdf:resource = 'http://data.oup.com/taxonomy/MIMEType/1']]/skos:prefLabel/text() |
nlm-core-rule-294 | error | | JATS and BITS QA rules applying to specified content elements and attributes | Check that @xlink:href starts "https://" for links to Creative Commons | report | *:license[not(ancestor::fig)] | (starts-with(@xlink:href,'http://creativecommons.org') or starts-with(@xlink:href,'https://creativecommons.org')) and not(matches(@xlink:href, '^https://')) |
nlm-core-rule-319 | error | | JATS and BITS QA rules applying to specified content elements and attributes | For a license element within an object such as a figure or table, checks the value of license type. | assert | *:license[ancestor::fig or ancestor::table-wrap or ancestor::graphic or ancestor::inline-graphic] | @license-type = (document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'LicenseType.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)]/skos:prefLabel/text(),'restricted','NoElectronicRight') |
nlm-core-rule-49 | error | NLM-1-0048 | JATS and BITS QA rules applying to specified content elements and attributes | Checks value of //list/@list-type. This rule checks against the PoolParty controlled vocabulary 'ListFormatType'. | assert | *:list | @list-type = document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'ListFormatType.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)]/skos:prefLabel/text() |
nlm-core-rule-271 | error | | JATS and BITS QA rules applying to specified content elements and attributes | A list element may not be a child of a p element. | report | *:list | parent::*:p and not(ancestor::*:statement) and not(ancestor::*:abstract) and not(ancestor::*:fn) and not(ancestor::*:caption) |
nlm-core-rule-101 | error | NLM-1-0104 | JATS and BITS QA rules applying to specified content elements and attributes | <media content-type="brightcove"> must have parent <fig> with attribute @fig-type whose value is "audio", "video", "featured-audio" or "featured-video". | report | *:media | not(parent::*:supplementary-material) and (@content-type = 'brightcove' and not(parent::*:fig[@fig-type = 'audio' or @fig-type = 'video' or @fig-type = 'featured-audio' or @fig-type = 'featured-video']) ) |
nlm-core-rule-102 | error | NLM-1-0105 | JATS and BITS QA rules applying to specified content elements and attributes | <media> must contain two <object-id> elements, one for the referenceid and one for the videoid of the audio/video item. | report | *:media | @content-type = 'brightcove' and not( child::*:object-id[@pub-id-type = 'referenceid'] and child::*:object-id[@pub-id-type = 'videoid'] and count(child::*:object-id) = 2 ) |
nlm-core-rule-195 | error | | JATS and BITS QA rules applying to specified content elements and attributes | A video object-id/@referenceid must not contain /. | report | *:media | contains(*:object-id[@pub-id-type='referenceid'],'/') |
nlm-core-rule-257 | error | | JATS and BITS QA rules applying to specified content elements and attributes | @mimetype attribute of media must have value "audio", "video", "model", or "text". This rule checks against the PoolParty controlled vocabulary 'MIMEType'. | assert | *:media | @mimetype = document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'MIMEType.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)][child::skos:broader[@rdf:resource = 'http://data.oup.com/taxonomy/MIMEType/5']]/skos:prefLabel/text() |
nlm-core-rule-112 | error | | JATS and BITS QA rules applying to specified content elements and attributes | mixed-citation element must have a non-empty value of @publication-type | assert | *:mixed-citation | @publication-type and @publication-type != '' |
nlm-core-rule-178 | error | | JATS and BITS QA rules applying to specified content elements and attributes | Checks for empty elements in mixed-citation. | report | *:mixed-citation | child::*[count(child::*) = 0 and normalize-space(string(.)) = '' and not(self::inline-graphic)] |
nlm-core-rule-272 | error | | JATS and BITS QA rules applying to specified content elements and attributes | A data citation or a software citation may not contain an article-title element. | report | *:mixed-citation | (@publication-type = ('data','software')) and child::*:article-title |
nlm-core-rule-273 | error | | JATS and BITS QA rules applying to specified content elements and attributes | A data citation must contain a data-title element. A software citation must contain a part-title element. | report | *:mixed-citation | (@publication-type = 'data' and not(child::*:data-title)) or (@publication-type = 'software' and not(child::*:part-title)) |
nlm-core-rule-275 | error | | JATS and BITS QA rules applying to specified content elements and attributes | Checks that mixed-citation/@publication-type attribute has valid value. This rule checks against the PoolParty controlled vocabulary 'BibliographicReferencePublicationType'. | assert | *:mixed-citation | @publication-type = document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'BibliographicReferencePublicationType.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)]/skos:prefLabel/text() |
nlm-core-rule-304 | error | | JATS and BITS QA rules applying to specified content elements and attributes | The name element may not be used in mixed-citation (we require string-name). | report | *:mixed-citation | child::*:name or child::*:person-group/*:name |
nlm-core-rule-342 | error | | JATS and BITS QA rules applying to specified content elements and attributes | Checks for mixed-citation elements containing more than one edition element (which causes a Crossref deposit failure). | report | *:mixed-citation | exists(child::edition[2]) |
nlm-core-rule-315 | error | | JATS and BITS QA rules applying to specified content elements and attributes | Flags if a semantic MathML element is used | report | | self::* |
nlm-core-rule-214 | error | | JATS and BITS QA rules applying to specified content elements and attributes | Checks that MathML has at least one non-empty text node. | assert | mml:math | descendant::text()[normalize-space() ne ''] |
nlm-core-rule-233 | error | | JATS and BITS QA rules applying to specified content elements and attributes | Checks that parent of mml:math and tex-math is disp-formula or inline-formula. | assert | | parent::*:disp-formula or parent::*:inline-formula |
nlm-core-rule-310 | error | | JATS and BITS QA rules applying to specified content elements and attributes | <m:math> must not contain deprecated @mode attribute. | report | mml:math | @mode |
nlm-core-rule-311 | error | | JATS and BITS QA rules applying to specified content elements and attributes | <m:math> must not contain deprecated @other attribute. | report | mml:math | @other |
nlm-core-rule-312 | error | | JATS and BITS QA rules applying to specified content elements and attributes | <m:math> must not contain deprecated @macros attribute. | report | mml:math | @macros |
nlm-core-rule-8 | error | NLM-1-0008 | JATS and BITS QA rules applying to specified content elements and attributes | Certain elements (e.g. mml:mtext) shouldn't repeat as consecutive siblings. (Exception: when parent is mml:sup, mml:sub, or mml:subsup) | report | | not( parent::mml:msup or parent::mml:msub or parent::mml:msubsup or parent::mml:mfrac ) and ( name(.) = name(preceding-sibling::*[1]) ) |
nlm-core-rule-313 | error | | JATS and BITS QA rules applying to specified content elements and attributes | MathML mml:mtable element must contain mml:mtr. | assert | mml:mtable | child::mml:mtr |
nlm-core-rule-314 | error | | JATS and BITS QA rules applying to specified content elements and attributes | MathML mml:mtr element must contain mml:mtd. | assert | mml:mtr | child::mml:mtd |
nlm-core-rule-212 | error | | JATS and BITS QA rules applying to specified content elements and attributes | mml:none is only allowed as a child of mml:mmultiscripts. | assert | mml:none | parent::mml:mmultiscripts |
nlm-core-rule-211 | error | | JATS and BITS QA rules applying to specified content elements and attributes | mml:semantics is only allowed as a child of mml:math. | assert | mml:semantics | parent::mml:math |
nlm-core-rule-343 | error | | JATS and BITS QA rules applying to specified content elements and attributes | Checks MathML elements that require two or more child components such as a base and superscript for msup. | assert | mml:msup | mml:msub | mml:msubsup | mml:munder | mml:mover | mml:munderover |
| (if (self::*:msubsup or self::*:munderover) then exists(child::*[3]) else exists(child::*[2])) and not(child::*[normalize-space(string(.)) = '']) |
nlm-core-rule-216 | error | | JATS and BITS QA rules applying to specified content elements and attributes | Checks that object-id/@pub-id-type attribute has valid value. This rule checks against the PoolParty controlled vocabulary 'MediaObjectIDType'. | assert | *:object-id | @pub-id-type = document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'MediaObjectIDType.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)]/skos:prefLabel/text() |
nlm-core-rule-3 | error | NLM-1-0003 | JATS QA rules applying to metadata | JATS and BITS QA rules applying to metadata | JATS and BITS QA rules applying to specified content elements and attributes |
| Certain elements may not contain only typographic formatting | assert | *:article-title | *:subtitle | *:p | *:title |
| not(doc-available('helpers/scout/Publishers.rdf')) or self::*:p[not( ancestor::*:caption or ancestor::*:abstract )] or self::*:subtitle[ ancestor::*[ self::*:citation or self::*:product or self::*:element-citation or self::*:mixed-citation or self::*:nlm-core-abstract-rule-citation ] ] or self::*:title[count(child::*) = 0 and normalize-space(string(.)) = ''] or child::text()[normalize-space(.) != ''] or child::*[ not( self::*:italic or self::*:bold or self::*:sc or self::*:sup or self::*:sub ) ] or child::*/child::node()[normalize-space() !=''] [position() = 1 or position() = last()] [self::*:xref] |
nlm-core-rule-193 | warning | | JATS and BITS QA rules applying to specified content elements and attributes | GenBank mentioned with a call out. | report | *:p | parent::*:sec and (contains(lower-case(.), 'genbank') or contains(lower-case(.), 'gen bank')) and not(child::*:ext-link[@ext-link-type='gen']) |
nlm-core-rule-249 | error | | JATS and BITS QA rules applying to specified content elements and attributes | Private use unicode range must no be used in the XML. | report | *:p | matches(., '\p{IsPrivate_Use}') |
nlm-core-rule-289 | error | | JATS and BITS QA rules applying to specified content elements and attributes | External links starting www., http:// or https:// must be captured with an <ext-link> element. | report | *:p | descendant::text()[contains(lower-case(.), 'www.') or contains(lower-case(.), 'http://') or contains(lower-case(.), 'https://')][not(ancestor::*:ext-link)] |
nlm-core-rule-255 | error | | JATS and BITS QA rules applying to specified content elements and attributes | One person-group element per role must be used. | report | *:person-group | ./preceding-sibling::*:person-group[@person-group-type = ./@person-group-type] |
nlm-core-rule-303 | error | | JATS and BITS QA rules applying to specified content elements and attributes | @person-group-type value must be one of those allowed in SCJATS and SCBITS. | assert | *:person-group | @person-group-type = ('author', 'editor', 'translator', 'curator') |
nlm-core-rule-97 | error | NLM-1-0101 | JATS and BITS QA rules applying to specified content elements and attributes | <private-char> must be used only with express permission from
OUP. | report | *:private-char | self::*:private-char |
nlm-core-rule-269 | error | | JATS and BITS QA rules applying to specified content elements and attributes | Only one <mixed-citation> is permitted in <ref> | report | *:ref | *:mixed-citation[2] |
nlm-core-rule-100 | error | NLM-1-0103b | JATS QA rules applying to metadata | JATS and BITS QA rules applying to metadata | JATS and BITS QA rules applying to specified content elements and attributes |
| ArXiv ID validity check. An ArXiv ID starts with "arXiv:". | report | *:article-id | *:pub-id | *:ref |
| @pub-id-type = 'arxiv' and not( starts-with(., 'arXiv:') ) |
nlm-core-rule-341 | error | | JATS and BITS QA rules applying to specified content elements and attributes | Checks for references with dois where the prefix belongs to a known data repository. Flags an error if this is not captured with publication-type="data". | report | *:ref | child::*:mixed-citation[not(@publication-type='data')] and if (descendant::*:ext-link[contains(.,'10.5061') or contains(.,'10.24433') or contains(.,'10.6084') or contains(.,'10.7910') or contains(.,'10.5281')] or descendant::pub-id[contains(.,'10.5061') or contains(.,'10.24433') or contains(.,'10.6084') or contains(.,'10.7910') or contains(.,'10.5281')]) then 'yes' else 'no'='yes' |
nlm-core-rule-10 | error | NLM-1-0010 | JATS and BITS QA rules applying to specified content elements and attributes | Small Caps should consist of normal sentence case | report | *:sc | matches(., '^[\s\p{Lu}]*$') or ( matches(., '^[\s\p{Ll}]*$') and matches(preceding-sibling::text()[1], '\p{Lu}$') ) |
nlm-core-rule-6 | error | NLM-1-0006 | JATS and BITS QA rules applying to specified content elements and attributes | Certain elements (e.g. sec) must have children other than 'title' | assert | *:sec | child::*[not(self::*:title)] |
nlm-core-rule-175 | error | | JATS and BITS QA rules applying to specified content elements and attributes | string-name must not contain more than 1 surname or more than 1 given-names. | report | *:string-name | child::*:surname[2] or child::*:given-names[2] |
nlm-core-rule-251 | error | | JATS and BITS QA rules applying to specified content elements and attributes | string-name containing <given-names> with no <surname> | report | *:string-name | *:given-names and not(*:surname) |
nlm-core-rule-268 | error | | JATS and BITS QA rules applying to specified content elements and attributes | <suffix> element must not contain more than 10 characters (crossRef limitation). | report | *:suffix | string-length(.) > 10 |
nlm-core-rule-322 | error | | JATS and BITS QA rules applying to specified content elements and attributes | Checks that table elements do not have direct child tr elements, these should be child elements of a tbody or thead element. | report | *:table | .[child::*:tr] |
bits-core-rule-105 | error | | JATS and BITS QA rules applying to specified content elements and attributes | Checks for table elements that use @content-type='multi-column' incorrectly, where they have a caption. | report | *:table | .[@content-type='multi-column' and preceding-sibling::caption] |
nlm-core-rule-259 | error | | JATS and BITS QA rules applying to specified content elements and attributes | <tex-math> may not contain whitespace outside the $ delimiter. | assert | *:tex-math | string-length(.) = string-length(normalize-space(.)) |
nlm-core-rule-264 | error | | JATS and BITS QA rules applying to specified content elements and attributes | For inline math use a inline-formula element with a $ delimiter. For block math use a disp-formula element with a $$ delimiter. | assert | *:tex-math | starts-with(normalize-space(.),'$') |
nlm-core-rule-301 | warning | | JATS and BITS QA rules applying to specified content elements and attributes | Checks content of <tex-math> element: if there is a '\textrm' tag containing an underscore, a warning is triggered to check if this is intended to produce subscript formatting. | report | *:tex-math | string()[matches(.,'.+textrm\{[\S]+_[\S]+\}.+')] or string()[matches(.,'.+textrm\{_[\S]+\}.+')] |
nlm-core-rule-160 | error | | JATS QA rules applying to metadata | JATS and BITS QA rules applying to metadata | JATS and BITS QA rules applying to specified content elements and attributes | BITS QA rules applying to specified content elements and attributes |
| Certain elements (e.g. titles in abstracts, keywords, affiliations) should not end with punctuation or spaces. | assert | *:aff | *:degrees | *:kwd | *:title | *:label |
| self::*:title[not(parent::*:sec/ancestor::*:abstract)] or self::*:label[not(parent::*:sec or parent::*:title-group)] or not(matches(normalize-space(string()),'[,\.;:\-–—]$')) |
nlm-core-rule-288 | error | | JATS and BITS QA rules applying to specified content elements and attributes | For table integrity, number of columns must be the same in all rows. | assert | *:tr | empty(preceding-sibling::*:tr) or oupfn:count-columns(.) = oupfn:count-columns(preceding-sibling::*:tr[1]) |
nlm-core-rule-23 | error | NLM-1-0023 | JATS and BITS QA rules applying to specified content elements and attributes | xref element must have @rid and @ref-type. | assert | *:xref | exists(@ref-type) and exists(@rid) |
nlm-core-rule-25 | error | NLM-1-0025 | JATS and BITS QA rules applying to specified content elements and attributes | Checks that xref/@ref-type corresponds to name of target element. | assert | *:xref | <xsl:key name="ID" match="*[@id]" use="@id"/>
exists(/comment()[matches(.,'Converted to\s+(SC|)BITS')]) or ( @ref-type = 'fn' and key('ID',tokenize(@rid, ' ')[1])[self::*:fn[not(ancestor::*:table-wrap-foot)]] ) or ( @ref-type = 'table-fn' and key('ID',tokenize(@rid, ' ')[1])[self::*:fn[ancestor::*:table-wrap-foot]] ) or ( @ref-type = 'bibr' and key('ID',tokenize(@rid, ' ')[1])[self::*:ref] ) or ( @ref-type = 'aff' and key('ID',tokenize(@rid, ' ')[1])[self::*:aff] ) or ( @ref-type = 'corresp' and key('ID',tokenize(@rid, ' ')[1])[self::*:corresp] ) or ( @ref-type = 'app' and key('ID',tokenize(@rid, ' ')[1])[self::*:app] ) or ( @ref-type = 'boxed-text' and key('ID',tokenize(@rid, ' ')[1])[self::*:boxed-text] ) or ( @ref-type = 'disp-formula' and key('ID',tokenize(@rid, ' ')[1])[self::*:disp-formula] ) or ( @ref-type = 'fig' and key('ID',tokenize(@rid, ' ')[1])[self::*:fig] ) or ( @ref-type = 'table' and key('ID',tokenize(@rid, ' ')[1])[self::*:table or self::*:table-wrap] ) or ( @ref-type = 'sec' and key('ID',tokenize(@rid, ' ')[1])[self::*:sec] ) or ( @ref-type = 'supplementary-material' and key('ID',tokenize(@rid, ' ')[1])[self::*:supplementary-material] ) or ( @ref-type = 'glossary-term' and key('ID',tokenize(@rid, ' ')[1])[self::*:term] ) or ( @ref-type = 'other' ) |
nlm-core-rule-131 | error | | JATS and BITS QA rules applying to specified content elements and attributes | Flags if xref in a contributor has invalid @ref-type. | report | *:xref | parent::*:contrib and not( @ref-type = 'aff' or @ref-type = 'corresp' or @ref-type = 'fn' ) |
nlm-core-rule-221 | warning | | JATS and BITS QA rules applying to specified content elements and attributes | Warns if xref element ends with a comma. | report | *:xref | ends-with(normalize-space(string()),',') |
nlm-core-rule-109 | error | | JATS QA rules applying to specified content elements and attributes | Citation ID must match the pattern [journal-id]-[article-id]-citation-\d+ | assert | @id[parent::*:citation] | matches( ., concat( '^', /*:article/*:front/*:journal-meta/*:journal-id[@journal-id-type = 'publisher-id'], '-', /*:article/*:front/*:article-meta/*:article-id[@pub-id-type = 'publisher-id'], '-citation-\d+$' ) ) |
nlm-core-rule-184 | error | | JATS QA rules applying to specified content elements and attributes | Checks that @xlink:href value is not uppercase. | report | @xlink:href | (parent::*:graphic or parent::*:inline-graphic) and matches(.,'\p{Lu}') |
nlm-core-rule-14 | error | NLM-1-0014 | JATS QA rules applying to specified content elements and attributes | Checks for presence of @article-type attribute | assert | *:article | @article-type and @article-type != '' |
nlm-core-rule-15 | error | NLM-1-0014 | JATS QA rules applying to specified content elements and attributes | Checks for correct @article-type attribute when the article-meta contains a product | report | *:article | ( child::*:front/*:article-meta/*:product and not( @article-type='book-review' or @article-type='product-review' ) ) |
nlm-core-rule-108 | warning | | JATS QA rules applying to specified content elements and attributes | Warning if article contains no email addresses. | assert | *:article | descendant::*:email |
nlm-core-rule-115 | error | NLM-1-0016 | JATS QA rules applying to specified content elements and attributes | Checks article elements have the correct value of @article-type. This rule checks against the PoolParty controlled vocabulary 'ArticleType'. | assert | *:article | @article-type = document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'ArticleType.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)]/skos:prefLabel/text() |
nlm-core-rule-145 | warning | | JATS QA rules applying to specified content elements and attributes | Warning if content appears to indicate funding information but the details are not captured in the article-meta. | report | *:article | (descendant::*:sec|descendant::*:ack)/*:title[lower-case(.) = 'funding'] and not( child::*:front/*:article-meta/*:funding-group ) |
nlm-core-rule-147 | error | | JATS QA rules applying to specified content elements and attributes | PAP articles must not have volume or issue numbers. | report | *:article | if (/*:article/*:front/*:article-meta/*:custom-meta-group/*:custom-meta[ *:meta-name/text() = 'article-lifecycle' and *:meta-value/text() = 'PAP' ]) then true() else false() and ( child::*:front/*:article-meta/*:volume or child::*:front/*:article-meta/*:issue ) |
nlm-core-rule-191 | warning | | JATS QA rules applying to specified content elements and attributes | @article-type="other" needs to be questioned. | report | *:article | @article-type='other' |
nlm-core-rule-209 | error | | JATS QA rules applying to specified content elements and attributes | A correction must have body text (not just an abstract). | report | *:article | @article-type = 'correction' and not(child::*:body) and not(child::*:front/*:article-meta/*:custom-meta-group/*:custom-meta/*:meta-value[. = 'accepted-manuscript']) |
nlm-core-rule-247 | error | | JATS QA rules applying to specified content elements and attributes | Certain kinds of article must not contain a body element | report | *:article | ( *:front/*:article-meta/*:article-categories/*:subj-group/*:subject[text() = 'InSight'] or @article-type = 'abstract' or *:front/*:article-meta/*:custom-meta-group/*:custom-meta/*:meta-value[text() = 'accepted-manuscript'] ) and child::*:body |
nlm-core-rule-290 | error | | JATS QA rules applying to specified content elements and attributes | Article must have a page count. This does not apply to articles which have no body element. | report | *:article | descendant::*:body and not(descendant::*:counts/*:page-count) |
nlm-core-rule-199 | error | | JATS QA rules applying to specified content elements and attributes | Oxford taxonomy subject not present. | assert | *:article-categories | count(child::*:subj-group[@subj-group-type='category-taxonomy-collection']/*:subject[starts-with(text(),'AcademicSubjects/')]) > 0 |
nlm-core-rule-293 | error | | JATS QA rules applying to specified content elements and attributes | <ext-link @ext-link-type='doi'> must not be used. In <mixed-citation> capture a DOI using <pub-id> with @pub-id-type='doi'. | report | *:ext-link | @ext-link-type='doi' or (parent::mixed-citation and @ext-link-type='uri' and matches(.,'http[s]?://doi.org')) |
nlm-core-rule-196 | error | | JATS QA rules applying to specified content elements and attributes | 3D model fig must have an object-id with @pub-id-type of doi | report | *:fig | @fig-type='model' and not(child::*:object-id[@pub-id-type='doi']) |
nlm-core-rule-197 | error | | JATS QA rules applying to specified content elements and attributes | 3D model fig must have an media with @content-type of sketchfab. | report | *:fig | @fig-type='model' and not(child::*:media[@content-type='sketchfab']) |
nlm-core-rule-51 | error | NLM-1-0050 | JATS QA rules applying to specified content elements and attributes | Element 'list-item' should not have a 'label' child (unless the list type is "simple"). | report | *:list-item | not(ancestor::*:list/@list-type = 'simple') and child::*:label |
nlm-core-rule-305 | error | | JATS QA rules applying to specified content elements and attributes | For a journal article, the value of the link must begin 'https://players.brightcove.net/1611106596001/default_default/index.html?videoId=' followed by the Brightcove video id. | assert | *:media | starts-with(@xlink:href,'https://players.brightcove.net/1611106596001/default_default/index.html?videoId=') |
nlm-core-rule-204 | error | | JATS QA rules applying to specified content elements and attributes | Parent of a notes element must be a back element. | assert | *:notes | parent::*:back |
nlm-core-rule-121 | error | | JATS and BITS QA rules applying to specified content elements and attributes | JATS QA rules applying to specified content elements and attributes |
| Flags if a deprecated element is used | report | *:element-citation | *:response |
| self::* |
nlm-core-rule-119 | error | | JATS and BITS QA rules applying to metadata | JATS and BITS QA rules applying to specified content elements and attributes | JATS QA rules applying to specified content elements and attributes |
| Checks that element has a title. Exception: abstract with @abstract-type of "teaser". | assert | *:abstract | *:ack | *:ref-list | *:sec[parent::*:abstract] |
| child::*:title or (self::*:abstract and @abstract-type = 'teaser') |
nlm-core-rule-186 | warning | | JATS QA rules applying to specified content elements and attributes | Appendices must be captured in <app>. | report | *:sec[parent::*:abstract] | *:sec |
| parent::*:back and *:title[contains(lower-case(.), 'appendi')] |
nlm-core-rule-238 | error | | JATS QA rules applying to specified content elements and attributes | Checks that Funding sec is not in supplementary material. | report | *:sec[parent::*:abstract] | *:sec |
| child::*:title[starts-with(., 'Supplementary')] and child::*:sec[child::*:title[(. = 'Funding') or (. = 'Financial Support')]] |
nlm-core-rule-279 | error | | JATS QA rules applying to specified content elements and attributes | Report if sec with @sec-type="data-availability" is not a child of back. | report | *:sec[parent::*:abstract] | *:sec |
| @sec-type = 'data-availability' and not(parent::*:back) |
nlm-core-rule-280 | error | | JATS QA rules applying to specified content elements and attributes | Report if sec with @sec-type="data-availability" has incorrect title. | report | *:sec[parent::*:abstract] | *:sec |
| @sec-type = 'data-availability' and not(lower-case(*:title/text()) eq 'data availability') |
nlm-core-rule-132 | error | | JATS QA rules applying to specified content elements and attributes | Flags if xref in a contributor has a child node. | report | *:xref | parent::*:contrib and child::node() |
nlm-core-rule-236 | warning | | JATS QA rules applying to specified content elements and attributes | Content of <xref> but be inside <sup> | report | *:xref | (parent::*:article-title and @ref-type[. = 'fn']) and not(child::*:sup) |
nlm-core-rule-230 | error | | Journals JATS complex | Checking article issue-title against issue_meta | report | *:issue-title[not(tokenize(namespace-uri(/*),'/')[last()] = 'SCJATS-journalissue.xsd')][ if ( oupfn:doc-available('issue_meta.xml', base-uri())) then true() else false() ] | . != if (exists(if ( if ( oupfn:doc-available('issue_meta.xml', base-uri())) then true() else false() and doc-available(resolve-uri('issue_meta.xml', if (exists(base-uri())) then base-uri() else ''))) then document(resolve-uri('issue_meta.xml', if (exists(base-uri())) then base-uri() else '')) else ())) then (if ( if ( oupfn:doc-available('issue_meta.xml', base-uri())) then true() else false() and doc-available(resolve-uri('issue_meta.xml', if (exists(base-uri())) then base-uri() else ''))) then document(resolve-uri('issue_meta.xml', if (exists(base-uri())) then base-uri() else '')) else ()/*:issue-meta/*:issue-title) else () |
nlm-core-rule-20 | error | NLM-1-0019 | Journals JATS complex | JATS QA rules applying to article metadata only (not issue meta) |
| Checks valid types of pub-date | assert | *:pub-date[not(tokenize(namespace-uri(/*),'/')[last()] = 'SCJATS-journalissue.xsd')][ if ( oupfn:doc-available('issue_meta.xml', base-uri())) then true() else false() ] | *:pub-date[not(tokenize(namespace-uri(/*),'/')[last()] = 'SCJATS-journalissue.xsd')] |
| parent::*:issue-meta or ( @pub-type = 'epub' and count(../*:pub-date[@pub-type='epub']) = 1 and child::*:day and child::*:month ) or ( @pub-type='collection' and ../*:pub-date[@pub-type='epub'] and child::*:day and child::*:month ) or ( @pub-type = 'cover' and ../*:pub-date[@pub-type='epub'] ) |
nlm-core-rule-201 | warning | | Journals JATS complex | Checking article pub-date against issue_meta | report | *:pub-date[not(tokenize(namespace-uri(/*),'/')[last()] = 'SCJATS-journalissue.xsd')][ if ( oupfn:doc-available('issue_meta.xml', base-uri())) then true() else false() ] | exists(if ( if ( oupfn:doc-available('issue_meta.xml', base-uri())) then true() else false() and doc-available(resolve-uri('issue_meta.xml', if (exists(base-uri())) then base-uri() else ''))) then document(resolve-uri('issue_meta.xml', if (exists(base-uri())) then base-uri() else '')) else ()) and @iso-8601-date ne if ( if ( oupfn:doc-available('issue_meta.xml', base-uri())) then true() else false() and doc-available(resolve-uri('issue_meta.xml', if (exists(base-uri())) then base-uri() else ''))) then document(resolve-uri('issue_meta.xml', if (exists(base-uri())) then base-uri() else '')) else ()/*:issue-meta/*:pub-date[@pub-type=@pub-type]/@iso-8601-date |
nlm-core-rule-337 | error | | Journals JATS complex | The subject TOC heading value in the article XML must match the toc-sec title value for the same article in the issue meta file. | report | *:subject[parent::subj-group[@subj-group-type='category-toc-heading']][not(tokenize(namespace-uri(/*),'/')[last()] = 'SCJATS-journalissue.xsd')][ if ( oupfn:doc-available('issue_meta.xml', base-uri())) then true() else false() ] | .[not(following-sibling::*:subj-group)] and not(./text()= if ( if ( oupfn:doc-available('issue_meta.xml', base-uri())) then true() else false() and doc-available(resolve-uri('issue_meta.xml', if (exists(base-uri())) then base-uri() else ''))) then document(resolve-uri('issue_meta.xml', if (exists(base-uri())) then base-uri() else '')) else ()/*:issue-meta/*:table-of-contents//*:title[following-sibling::*:toc-content[@xlink:href=/*:article/*:front/*:article-meta/*:article-id[@pub-id-type = 'doi']]]) |
nlm-core-rule-33 | error | NLM-1-0033 | JATS QA rules applying to metadata | Checks that the @xml:lang attribute on trans-abstract and trans-title are not
the same language as the article. This rule assumes that no language declaration
on the article implies the language is 'en'. | report | @xml:lang | ( parent::*:trans-abstract[parent::*:article-meta] or parent::*:trans-title[not(ancestor::*:ref)] ) and ( oupfn:to-lower(string(.)) = oupfn:to-lower(if ((/*:article|/*:article/*:sub-article|/*:article/*:response)/@xml:lang) then string((/*:article|/*:article/*:sub-article|/*:article/*:response)/@xml:lang) else 'en') ) |
nlm-core-rule-170 | warning | | JATS QA rules applying to metadata | Warn if article abstract looks like it should be captured as a structured abstract. | report | *:abstract | child::*:p/child::node()[normalize-space() != ''][1] [self::*:bold] [descendant::text()[matches(.,'[\W]$')]] |
nlm-core-rule-190 | error | | JATS QA rules applying to metadata | Teaser must not have a title. | report | *:abstract | @abstract-type='teaser' and *:title |
nlm-core-rule-200 | error | | JATS QA rules applying to metadata | Abstract with abstract-type 'graphical', 'audio' or 'video' must have a <fig> element. | report | *:abstract | (@abstract-type='graphical' or @abstract-type='video' or @abstract-type='audio') and not(child::*:p[child::*:fig]) |
nlm-core-rule-262 | error | | JATS QA rules applying to metadata | Lay Summary must have title 'Lay Summary' | report | *:abstract | @specific-use='layperson' and not(*:title/text() = 'Lay Summary') |
nlm-core-rule-263 | error | | JATS QA rules applying to metadata | Lay Summary must not contain graphic, inline-graphic or media. | report | *:abstract | @specific-use='layperson' and (descendant::*:graphic or descendant::*:inline-graphic or descendant::*:media) |
nlm-core-rule-320 | error | | JATS QA rules applying to metadata | Checks value of @abstract-type for media, audio and graphical abstracts per JATS4R Abstracts recommendation. | report | *:abstract | (.[descendant::*:media[@mimetype='video'] and not(@abstract-type='video')]) or (.[descendant::*:media[@mimetype='audio'] and not(@abstract-type='audio')]) or (.[descendant::*:label='Graphical Abstract' and not(@abstract-type='graphical')]) |
nlm-core-rule-130 | error | | JATS QA rules applying to metadata | JATS and BITS QA rules applying to metadata | JATS and BITS QA rules applying to specified content elements and attributes |
| Flags if no xref or related-object is found which targets the aff, corresp, or fn element. | assert | | @id = //*:xref/@rid or @id = //*:related-object/@object-id or self::*:fn[parent::*:table-wrap-foot] or self::*:aff[parent::*:contrib] |
nlm-core-rule-160 | error | | JATS QA rules applying to metadata | JATS and BITS QA rules applying to metadata | JATS and BITS QA rules applying to specified content elements and attributes | BITS QA rules applying to specified content elements and attributes |
| Certain elements (e.g. titles in abstracts, keywords, affiliations) should not end with punctuation or spaces. | assert | *:aff | *:degrees | *:kwd | *:title | *:label |
| self::*:title[not(parent::*:sec/ancestor::*:abstract)] or self::*:label[not(parent::*:sec or parent::*:title-group)] or not(matches(normalize-space(string()),'[,\.;:\-–—]$')) |
nlm-core-rule-189 | error | | JATS QA rules applying to metadata | aff must not be repeated. | report | *:aff | . = preceding-sibling::*:aff |
nlm-core-rule-100 | error | NLM-1-0103b | JATS QA rules applying to metadata | JATS and BITS QA rules applying to metadata | JATS and BITS QA rules applying to specified content elements and attributes |
| ArXiv ID validity check. An ArXiv ID starts with "arXiv:". | report | *:article-id | *:pub-id | *:ref |
| @pub-id-type = 'arxiv' and not( starts-with(., 'arXiv:') ) |
nlm-core-rule-215 | error | | JATS QA rules applying to metadata | Checks that article-id/@pub-id-type attribute has valid value. This rule checks against the PoolParty controlled vocabulary 'ArticleIDType'. | assert | *:article-id | @pub-id-type = document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'ArticleIDType.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)]/skos:prefLabel/text() |
nlm-core-rule-260 | error | | JATS QA rules applying to metadata | publisher-id must be longer than 4 characters. | report | *:article-id | @pub-id-type = 'publisher-id' and string-length(.) < 5 |
nlm-core-rule-203 | error | | JATS QA rules applying to metadata | JATS and BITS QA rules applying to specified content elements and attributes |
| Checks that @xlink:href and article-id values do not begin or end with a space character. | assert | | . = normalize-space(.) |
nlm-core-rule-292 | error | | JATS QA rules applying to metadata | <article-id pub-id-type="doi"> must begin with the correct prefix from the journals master list for each journal eISSN. | report | *:article-id | @pub-id-type='doi' and not(replace(text(), '^(\d*\.\d*/[^/]+/).*$', '$1') = document('helpers/journals-metadata/journals-master-list.xml')/jml:journals-master-list/jml:journal[jml:eissn/text() = string(if (local-name(/*) = 'article') then /*:article/*:front/*:journal-meta/*:issn[@pub-type='epub'] else /*:issue-meta/*:issue-identifier/*:issn[@pub-type = 'epub'])]/jml:doi-prefix) |
nlm-core-rule-345 | error | | JATS QA rules applying to metadata | Checks that article DOI conforms to the standard format for OUP journal article DOIs | report | *:article-id | parent::*:article-meta and @pub-id-type='doi' and not(matches(text(), '^10.1093/[a-z]+/[a-z]+[\d]+[.]?[\d]*$')) |
nlm-core-rule-18 | error | NLM-1-0017 | JATS QA rules applying to metadata | Checks article-meta has article-categories child. | assert | *:article-meta | child::*:article-categories |
nlm-core-rule-19 | error | NLM-1-0018 | JATS QA rules applying to metadata | Checks for fpage or elocation-id child of article-meta | assert | *:article-meta | child::*:fpage or child::*:elocation-id |
nlm-core-rule-72 | error | NLM-1-0076 | JATS QA rules applying to metadata | Article must have an article-id element with @pub-id-type="doi" | assert | *:article-meta | child::*:article-id[@pub-id-type='doi'] |
nlm-core-rule-85 | error | NLM-1-0090 | JATS QA rules applying to metadata | Article (that is not a PAP article) must contain volume and issue elements in article metadata. | assert | *:article-meta | if (/*:article/*:front/*:article-meta/*:custom-meta-group/*:custom-meta[ *:meta-name/text() = 'article-lifecycle' and *:meta-value/text() = 'PAP' ]) then true() else false() or ( child::*:volume and child::*:issue ) |
nlm-core-rule-86 | error | NLM-1-0091 | JATS QA rules applying to metadata | Article (that is not a PAP article) must have a print or collection publication date (but not both). A PAP article must have neither a print nor a collection publication date. | assert | *:article-meta | ( if (/*:article/*:front/*:article-meta/*:custom-meta-group/*:custom-meta[ *:meta-name/text() = 'article-lifecycle' and *:meta-value/text() = 'PAP' ]) then true() else false() and not( child::*:pub-date[@pub-type='ppub'] or child::*:pub-date[@pub-type='collection'] ) ) or ( not(if (/*:article/*:front/*:article-meta/*:custom-meta-group/*:custom-meta[ *:meta-name/text() = 'article-lifecycle' and *:meta-value/text() = 'PAP' ]) then true() else false()) and child::*:pub-date[@pub-type='ppub' or @pub-type='collection'] and not( child::*:pub-date[@pub-type='ppub'] and child::*:pub-date[@pub-type='collection'] ) ) |
nlm-core-rule-87 | error | NLM-1-0092 | JATS QA rules applying to metadata | Article must have an electronic publication date. | assert | *:article-meta | child::*:pub-date[@pub-type='epub'] |
nlm-core-rule-148 | warning | | JATS QA rules applying to metadata | Article metadata should contain a <self-uri> element containing a link to the PDF version of the article. (Archive content may sometimes be excepted from this rule.) | report | *:article-meta | not(child::*:self-uri) |
nlm-core-rule-149 | error | | JATS QA rules applying to metadata | Article metadata should contain one <self-uri> element with a link to the PDF version of the article. | report | *:article-meta | count(child::*:self-uri) > 1 |
nlm-core-rule-150 | error | | JATS QA rules applying to metadata | Article must have an article-id element with @pub-id-type="publisher-id" | assert | *:article-meta | child::*:article-id[@pub-id-type='publisher-id'] |
nlm-core-rule-163 | warning | | JATS QA rules applying to metadata | Articles where the @article-type is addendum, article-commentary, correction, reply, or retraction should have a related-article element in the article metadata. | report | *:article-meta | /*/@article-type[ . = 'addendum' or . = 'article-commentary' or . = 'correction' or . = 'reply' or . = 'retraction' ] and not( child::*:related-article ) |
nlm-core-rule-165 | error | | JATS QA rules applying to metadata | Warn if collection date is missing from Continuous Publication or Online Only journal (see also rule nlm-core-rule-156). | report | *:article-meta | if (document('helpers/journals-with-no-ppub-date.xml')/ss:Workbook/ss:Worksheet[1]/ss:Table[1]/ss:Row[not(@ss:Hidden)]/ss:Cell[1]/ss:Data/text() = /*:article/*:front/*:journal-meta/*:journal-id[@journal-id-type = 'publisher-id']) then true() else false() and not(child::*:pub-date[@pub-type = 'collection'] or descendant::*:custom-meta[child::*:meta-value ='PAP']) |
nlm-core-rule-185 | error | | JATS QA rules applying to metadata | elocation-id should be the OUP article ID (the same as the end of the DOI) | report | *:article-meta | not(if (local-name(/*) = 'article') then /*:article/*:front/*:journal-meta/*:issn[@pub-type='epub'] else /*:issue-meta/*:issue-identifier/*:issn[@pub-type = 'epub']='2050-3911') and *:elocation-id and not(*:elocation-id/text()=/*:article/*:front/*:article-meta/*:article-id[@pub-id-type = 'publisher-id']/text()) |
nlm-core-rule-188 | warning | | JATS QA rules applying to metadata | PDF filename must match publisher-id. | report | *:article-meta | substring-before(*:self-uri/@xlink:href,'.pdf')[1] != *:article-id[@pub-id-type='publisher-id'] |
nlm-core-rule-231 | error | | JATS QA rules applying to metadata | Checks that article-meta contains permissions. | assert | *:article-meta | child::*:permissions |
nlm-core-rule-239 | warning | | JATS QA rules applying to metadata | Checks for multiple featured content. | report | *:article-meta | child::*:supplementary-material[starts-with(@content-type, 'featured')][2] |
nlm-core-rule-287 | error | | JATS QA rules applying to metadata | Page count must be an integer. Letters and decimal points are not permitted. | report | *:article-meta | child::*:counts/*:page-count[matches(@count,'\D')] |
nlm-core-rule-3 | error | NLM-1-0003 | JATS QA rules applying to metadata | JATS and BITS QA rules applying to metadata | JATS and BITS QA rules applying to specified content elements and attributes |
| Certain elements may not contain only typographic formatting | assert | *:article-title | *:subtitle | *:p | *:title |
| not(doc-available('helpers/scout/Publishers.rdf')) or self::*:p[not( ancestor::*:caption or ancestor::*:abstract )] or self::*:subtitle[ ancestor::*[ self::*:citation or self::*:product or self::*:element-citation or self::*:mixed-citation or self::*:nlm-core-abstract-rule-citation ] ] or self::*:title[count(child::*) = 0 and normalize-space(string(.)) = ''] or child::text()[normalize-space(.) != ''] or child::*[ not( self::*:italic or self::*:bold or self::*:sc or self::*:sup or self::*:sub ) ] or child::*/child::node()[normalize-space() !=''] [position() = 1 or position() = last()] [self::*:xref] |
nlm-core-rule-166 | warning | | JATS QA rules applying to metadata | Warn if article title does not end in a word character or expected punctuation: ' " ” ’ . ! ? ) ]. | report | *:article-title | ancestor::*:article-meta and not( child::node() [not(descendant-or-self::*:xref)] [last()] [matches(string(),'[\w\?\)\.\]!''"”’]$')]) |
nlm-core-rule-176 | error | | JATS QA rules applying to metadata | collab must not contain certain strings. | report | *:collab | contains(lower-case(.), 'on behalf of') or contains(lower-case(.), 'document reviewers') |
nlm-core-rule-207 | error | | JATS QA rules applying to metadata | The content of the collab element must be a text node optionally followed by contrib-group elements. | assert | *:collab | child::node()[1][self::text()[normalize-space() ne '']] and ( count(child::node()) = 1 or child::node()[position() != 1][normalize-space() ne ''][self::*:contrib-group] ) |
nlm-core-rule-77 | error | NLM-1-0082 | JATS QA rules applying to metadata | Checks that email is present for corresponding author | report | *:contrib | ( @corresp = 'yes' and not(descendant::*:email) ) |
nlm-core-rule-140 | error | | JATS QA rules applying to metadata | Checks that no more than one email is present per contrib | report | *:contrib | count(child::*:email) > 1 |
nlm-core-rule-182 | error | | JATS QA rules applying to metadata | Checks role elements have the correct value. This rule checks against the PoolParty controlled vocabulary 'ContributorRole'. | report | *:contrib | @contrib-type = 'editor' and not(child::*:role[text() = ( 'Associate Editor', 'Conference Editor', 'Corresponding Editor', 'Decision Editor', 'Editor', 'Editor-in-Chief', 'Guest Editor', 'Handling Editor', 'Managing Editor', 'Section Editor', 'Special Issue Editor', 'Subject Editor' )]) |
nlm-core-rule-244 | error | | JATS QA rules applying to metadata | Contributors should not have more than one xref with @ref-type='corresp'. | report | *:contrib | *:xref[@ref-type ='corresp'][2] |
nlm-core-rule-282 | error | | JATS QA rules applying to metadata | The @corresp attribute may only be used on individual authors, not on collaboration groups. | report | *:contrib | @corresp and child::*:collab |
nlm-core-rule-286 | error | | JATS QA rules applying to metadata | A contrib element may contain only one name child element. | report | *:contrib | count(child::*:name) > 1 |
nlm-core-rule-327 | error | | JATS QA rules applying to metadata | contrib in sub-article/front-stub must have @contrib-type="author". | report | *:contrib | ancestor::*:sub-article and not(@contrib-type eq 'author') |
nlm-core-rule-328 | error | | JATS QA rules applying to metadata | contrib in sub-article/front-stub must have role/@specific-use with a valid value. This rule checks against the PoolParty controlled vocabulary 'PeerReviewContributorRoleSpecificUse'. | report | *:contrib | ancestor::*:sub-article and not(child::*:role/@specific-use = document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'PeerReviewContributorRoleSpecificUse.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)]/skos:prefLabel/text()) |
nlm-core-rule-336 | error | | JATS QA rules applying to metadata | A contrib may have one or more CRediT roles OR a non CRediT-role, not both. | report | *:contrib | .[role[@vocab='credit'] and role[not(@vocab)]] |
nlm-core-rule-138 | error | | JATS QA rules applying to metadata | Checks for correct structure for use of custom-meta. | assert | *:custom-meta | ( child::*:meta-name[. = 'edited-state'] and child::*:meta-value[ . = 'accepted-manuscript' or . = 'corrected-proof' ] ) or ( child::*:meta-name[. = 'article-lifecycle'] and child::*:meta-value[. = 'PAP'] ) or child::*:meta-name[. = 'open-science-badges'] or child::*:meta-name[. = 'peer-review-revision-round'] |
nlm-core-rule-237 | error | | JATS QA rules applying to metadata | Checks that open science badge meta-value has valid value. This rule checks against the PoolParty controlled vocabulary 'OpenScienceBadge'. | report | *:custom-meta | *:meta-name = 'open-science-badges' and not(*:meta-value = document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'OpenScienceBadge.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)]/skos:prefLabel/text()) |
nlm-core-rule-17 | error | NLM-1-0016 | JATS QA rules applying to metadata | Checks date elements have the correct value of @date-type. This rule checks against the PoolParty controlled vocabulary 'PubStatus'. | assert | *:date | parent::*:event or @date-type = document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'PubStatus.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)]/skos:prefLabel/text() |
nlm-core-rule-107 | error | | JATS QA rules applying to metadata | Checks that email element has content that looks like a valid email address and only contains one address. | assert | *:email | matches( ., '^[\w\-\+\.''_]*@[\w\-\._]+\.[\w]+$' ) |
nlm-core-rule-331 | error | | JATS QA rules applying to metadata | event/@event-type value must be a valid value. This rule checks against the PoolParty controlled vocabulary 'PeerReviewEventType'. | assert | *:event | @event-type = ('reviewer-report-received','author-comment-received','editor-decision-sent') |
nlm-core-rule-158 | error | | JATS QA rules applying to metadata | Each funding source in an article that is not OA must contain a 'release-delay' processing instruction. | report | *:funding-source | (not( if (/*:article/*:front/*:article-meta/*:permissions/*:license[starts-with(@license-type,'cc-')]) then true() else false() ) or if (/*:article/*:front/*:article-meta/*:permissions/*:license[@license-type='us-gov']) then true() else false() ) and not(child::processing-instruction('release-delay')[string() = '12|0' or string() = '0|0']) |
nlm-core-rule-168 | warning | | JATS QA rules applying to metadata | Warn if contributor name includes upper-case letter and full stop or two upper-case letters without a separator. (Initials must be separated by a space only.) | report | *:given-names | parent::*:name[parent::*:contrib] and matches(string(),'\p{Lu}[\.\p{Lu}]') |
nlm-core-rule-277 | warning | | JATS QA rules applying to metadata | Check given-names capture and move any surname prefixes to surname. | report | *:given-names | ends-with(lower-case(.), ' del') or ends-with(lower-case(.), ' von') or ends-with(lower-case(.), ' von der') or ends-with(lower-case(.), ' de') or ends-with(lower-case(.), ' el') or ends-with(lower-case(.), ' van') or ends-with(lower-case(.), ' van der') or ends-with(lower-case(.), ' de la') or ends-with(lower-case(.), ' du') or ends-with(lower-case(.), ' da') or ends-with(lower-case(.), ' ten') or ends-with(lower-case(.), ' ter') or ends-with(lower-case(.), ' den') or ends-with(lower-case(.), ' van den') or ends-with(lower-case(.), ' dos') or ends-with(lower-case(.), ' van de') or ends-with(lower-case(.), ' von de') |
nlm-core-rule-44 | error | NLM-1-0044 | JATS QA rules applying to metadata | Checks ISSN format | report | *:issn | ancestor::*:journal-meta and not( oupfn:is-valid-issn(.) ) |
nlm-core-rule-45 | error | NLM-1-0045 | JATS QA rules applying to metadata | Checks presence of @pub-type on issn element | assert | *:issn | @pub-type and @pub-type != '' |
nlm-core-rule-46 | error | NLM-1-0045 | JATS QA rules applying to metadata | Checks that @pub-type on issn element (not in a citation) has valid value. | report | *:issn | ( not( ancestor::*:citation or ancestor::*:nlm-citation or ancestor::*:mixed-citation or ancestor::*:element-citation or ancestor::*:product ) and not(@pub-type='ppub' or @pub-type='epub') ) |
nlm-core-rule-78 | error | NLM-1-0083 | JATS QA rules applying to metadata | Checks that there are no spaces in issue or volume elements | report | | parent::*:article-meta and matches(., '\s') |
nlm-core-rule-91 | error | NLM-1-0095 | JATS QA rules applying to metadata | Checks format of issue value. | report | *:issue | parent::*:article-meta and ( string() = '0' or not( ( @content-type = 'empty' and string() = '' ) or matches(., '^\d+$') or matches(., '^\d+(\-|–)\d+$') or matches(., '^Supplement_[a-zA-Z\d]+$') or matches(., '^\d+_Part_\d+$') or (/*:article/*:front/*:journal-meta/*:journal-id[@journal-id-type = 'publisher-id']='nar' and (matches(., 'D1') or matches(., 'W1'))) or (/*:article/*:front/*:journal-meta/*:journal-id[@journal-id-type = 'publisher-id']='hmg' and (matches(., 'R1') or matches(., 'R2'))) ) ) |
nlm-core-rule-128 | error | | JATS QA rules applying to metadata | Checks that @content-type="empty" is used for empty volume and issue elements. | report | | ( . = '' and not( @content-type = 'empty' ) ) |
nlm-core-rule-234 | error | | JATS QA rules applying to metadata | Checks for deprecated attribute @content-type="supplement". | report | *:issue | @content-type = 'supplement' |
nlm-core-rule-174 | error | | JATS QA rules applying to metadata | Checks for a br in issue-title | report | *:issue-title | parent::*:article-meta and child::*:br |
nlm-core-rule-278 | error | | JATS QA rules applying to metadata | Checking article issue-title against issue_meta | report | *:issue-sponsor | . != if (exists(if ( if ( oupfn:doc-available('issue_meta.xml', base-uri())) then true() else false() and doc-available(resolve-uri('issue_meta.xml', if (exists(base-uri())) then base-uri() else ''))) then document(resolve-uri('issue_meta.xml', if (exists(base-uri())) then base-uri() else '')) else ()/*:issue-meta/*:issue-sponsor)) then (if ( if ( oupfn:doc-available('issue_meta.xml', base-uri())) then true() else false() and doc-available(resolve-uri('issue_meta.xml', if (exists(base-uri())) then base-uri() else ''))) then document(resolve-uri('issue_meta.xml', if (exists(base-uri())) then base-uri() else '')) else ()/*:issue-meta/*:issue-sponsor) else '' |
nlm-core-rule-47 | error | NLM-1-0046 | JATS QA rules applying to metadata | Checks that @journal-id-type attribute has valid value. This rule checks against the PoolParty controlled vocabulary 'JournalIDType'. | assert | *:journal-id[parent::*:journal-meta] | @journal-id-type = document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'JournalIDType.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)]/skos:prefLabel/text() |
nlm-core-rule-71 | error | NLM-1-0075 | JATS QA rules applying to metadata | Article must have an electronic ISSN. | assert | *:journal-meta | child::*:issn[@pub-type='epub'] |
nlm-core-rule-83 | error | NLM-1-0088 | JATS QA rules applying to metadata | Checks for existence of OUP product code in journal metadata | assert | *:journal-meta | child::*:journal-id[@journal-id-type='publisher-id'] |
nlm-core-rule-106 | error | | JATS QA rules applying to metadata | <journal-id journal-id-type="publisher-id"> must match the corresponding code in the journals master list for each journal eISSN. | assert | *:journal-meta | child::*:journal-id[@journal-id-type='publisher-id'] = document('helpers/journals-metadata/journals-master-list.xml')/jml:journals-master-list/jml:journal[jml:eissn/text() = string(if (local-name(/*) = 'article') then /*:article/*:front/*:journal-meta/*:issn[@pub-type='epub'] else /*:issue-meta/*:issue-identifier/*:issn[@pub-type = 'epub'])]/jml:oup_code |
nlm-core-rule-48 | error | NLM-1-0047 | JATS QA rules applying to metadata | Checks that journal-meta has journal-title | assert | *:journal-title-group | child::*:journal-title |
nlm-core-rule-338 | error | | JATS QA rules applying to metadata | Element <name-alternatives> should only be used where the contributor has two names. | assert | *:name-alternatives | exists(child::*:name[2]) or (exists(child::*:name) and exists(child::*:string-name)) |
nlm-core-rule-339 | error | | JATS QA rules applying to metadata | <string-name> in <name-alternatives> should not contain <given-names> or <surname>. | report | *:string-name[parent::*:name-alternatives] | exists(child::*:given-names) or exists(child::*:surname) |
nlm-core-rule-181 | error | | JATS QA rules applying to metadata | Checks permissions (at article level) has license child. | report | *:permissions[not(ancestor::fig or ancestor::table-wrap or ancestor::graphic or ancestor::inline-graphic)] | parent::*:article-meta and not(child::*:license) |
nlm-core-rule-232 | error | | JATS QA rules applying to metadata | Checks that permissions contains copyright-year and copyright-statement. (JATS4R recommends also including copyright-holder.) | assert | *:permissions[not(ancestor::fig or ancestor::table-wrap or ancestor::graphic or ancestor::inline-graphic)] | child::*:copyright-year and child::*:copyright-statement |
nlm-core-rule-114 | content-warning | | JATS QA rules applying to metadata | Online publication date is expected to be less than a month in the future. | report | *:pub-date | (if (exists(@iso-8601-date)) then (string(@iso-8601-date)) else oupfn:getISO8601date(*:year/text(), *:month/text(), *:day/text()) castable as xs:date) and @pub-type = 'epub' and ( days-from-duration( xs:date(if (exists(@iso-8601-date)) then (string(@iso-8601-date)) else oupfn:getISO8601date(*:year/text(), *:month/text(), *:day/text())) - current-date() ) > 31 ) |
nlm-core-rule-156 | error | | JATS QA rules applying to metadata | Warn if ppub date found in Continuous Publication or Online Only journal. | report | *:pub-date | if (document('helpers/journals-with-no-ppub-date.xml')/ss:Workbook/ss:Worksheet[1]/ss:Table[1]/ss:Row[not(@ss:Hidden)]/ss:Cell[1]/ss:Data/text() = /*:article/*:front/*:journal-meta/*:journal-id[@journal-id-type = 'publisher-id']) then true() else false() and @pub-type = 'ppub' |
nlm-core-rule-220 | error | | JATS QA rules applying to metadata | Checks that pub-date/@pub-type attribute has valid value. This rule checks against the PoolParty controlled vocabulary 'JournalPubDateType'. | assert | *:pub-date | @pub-type = document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'JournalPubDateType.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)]/skos:prefLabel/text() or exists(@publication-format) |
nlm-core-rule-276 | error | | JATS QA rules applying to metadata | Check cover date month element for incorrectly captured values such as 'spring', 'summer'. | report | *:pub-date | @pub-type = 'cover' and child::*:month[ contains(lower-case(.),'spring') or contains(lower-case(.),'summer') or contains(lower-case(.),'fall') or contains(lower-case(.),'autumn') or contains(lower-case(.),'winter')] |
nlm-core-rule-281 | error | | JATS QA rules applying to metadata | Element pub-date where @pub-type="cover" must have a valid @iso-8601-date attribute. | report | *:pub-date | parent::*:issue-meta and @pub-type = 'cover' and ( not(@iso-8601-date) or not( oupfn:is-valid-ISO8601-date(@iso-8601-date) ) ) |
nlm-core-rule-340 | error | | JATS QA rules applying to metadata | Element pub-date where @pub-type="cover" must not have an @iso-8601-date attribute when present in the article xml. This is only required in issue-meta. | report | *:pub-date | parent::*:article-meta and @pub-type = 'cover' and exists(@iso-8601-date) |
nlm-core-rule-16 | error | NLM-1-0015 | JATS QA rules applying to metadata | Check @related-article-type is allowed value and corresponds correctly to @article-type | assert | *:related-article | ( ( @related-article-type='commentary' and ( /*:article/@article-type='editorial' or /*:article/@article-type='letter' or /*:article/@article-type='discussion' or /*:article/@article-type='article-commentary' ) ) or @related-article-type='companion' or ( @related-article-type='corrected-article' and /*:article/@article-type='correction' ) or ( @related-article-type='letter' and /*:article/@article-type='reply' ) or ( @related-article-type='retracted-article' and /*:article/@article-type='retraction' ) or ( @related-article-type='object-of-concern' and /*:article/@article-type='expression-of-concern' ) or ( @related-article-type='addendum' and /*:article/@article-type='addendum' ) or @related-article-type='update-to-article' ) |
nlm-core-rule-32 | error | NLM-1-0032 | JATS QA rules applying to metadata | JATS and BITS QA rules applying to metadata | JATS and BITS QA rules applying to specified content elements and attributes | BITS QA rules applying to specified content elements and attributes |
| Checks element has @id | assert | *:related-article | *:sec[parent::*:abstract] | *:corresp | *:supplementary-material[not(parent::*:issue-meta or parent::*:book-meta/parent::*:book-part-wrapper)] | *:ack | *:fn | mml:math | *:ref | *:ref-list | *:table-wrap | *:tex-math | *:ack | *:book-app | *:book-part | *:boxed-text | *:fig | *:fig-group | *:front-matter-part | *:index | *:index-group | *:ref-list | *:sec |
| exists(/comment()[matches(.,'Converted to\s+(SC|)BITS')]) or (exists(@id) and string(@id) ne '') |
nlm-core-rule-52 | error | NLM-1-0051 | JATS QA rules applying to metadata | Checks for required attributes of <related-article>. | assert | *:related-article | ( @ext-link-type='doi' and @related-article-type and @xlink:href ) |
nlm-core-rule-177 | error | | JATS QA rules applying to metadata | Checks for related-article in article-meta if there is one in body. | report | *:related-article | ancestor::*:body and not(//*:related-article[parent::*:article-meta]) |
nlm-core-rule-229 | error | | JATS QA rules applying to metadata | Warns if related-article DOI target matches the DOI of the parent article. | report | *:related-article | @xlink:href = /*:article/*:front/*:article-meta/*:article-id[@pub-id-type = 'doi']/text() |
nlm-core-rule-296 | error | | JATS QA rules applying to metadata | CRediT taxonomy can only be used for contributors with @contrib-type of "author". | report | *:role | @vocab='credit' and not(parent::*:contrib/@contrib-type='author') |
nlm-core-rule-297 | error | | JATS QA rules applying to metadata | Credit role must match CRediT taxonomy. | report | *:role | @vocab='credit' and not(document('helpers/scout/CRediT_Terms.rdf')/rdf:RDF/rdf:Description[skos:prefLabel=@vocab-term] and @vocab-term-identifier=document('helpers/scout/CRediT_Terms.rdf')/rdf:RDF/rdf:Description[skos:prefLabel=@vocab-term]/@rdf:about) |
nlm-core-rule-298 | error | | JATS QA rules applying to metadata | @degree-contribution values must match the taxonomy. | report | *:role | exists(@degree-contribution) and not(document('helpers/scout/CRediT_Degrees.rdf')/rdf:RDF/rdf:Description[skos:prefLabel=@degree-contribution]) |
nlm-core-rule-299 | error | | JATS QA rules applying to metadata | Credit role @vocab-term must match text of role. | report | *:role | @vocab='credit' and (@vocab-term != .) |
nlm-core-rule-93 | error | NLM-1-0097 | JATS QA rules applying to metadata | season element is only allowed as part of a cover date. | assert | *:season | parent::*:pub-date[@pub-type='cover'] |
nlm-core-rule-325 | error | | JATS QA rules applying to metadata | sub-article/@article-type value must be a valid value. This rule checks against the PoolParty controlled vocabulary 'SubarticleType'. | assert | *:sub-article | @article-type = ('author-comment','editor-report','reviewer-report') |
nlm-core-rule-326 | error | | JATS QA rules applying to metadata | sub-article/front-stub must contain a DOI. | assert | *:sub-article | exists(child::*:front-stub/*:article-id[@pub-id-type eq 'doi']) |
nlm-core-rule-329 | error | | JATS QA rules applying to metadata | sub-article/front-stub must contain a title. | assert | *:sub-article | exists(child::*:front-stub/*:title-group/*:article-title) |
nlm-core-rule-330 | error | | JATS QA rules applying to metadata | sub-article/front-stub must contain an event date. | assert | *:sub-article | exists(child::*:front-stub/*:pub-history/*:event/*:date) |
nlm-core-rule-332 | error | | JATS QA rules applying to metadata | sub-article/front-stub must contain a revision round. | assert | *:sub-article | exists(child::*:front-stub/*:custom-meta-group/*:custom-meta/*:meta-name[text() eq 'peer-review-revision-round']) |
nlm-core-rule-333 | error | | JATS QA rules applying to metadata | sub-article/front-stub must contain a valid revision round value. | assert | *:sub-article | exists(child::*:front-stub/*:custom-meta-group/*:custom-meta[*:meta-name/text() eq 'peer-review-revision-round']/*:meta-value/text()) and child::*:front-stub/*:custom-meta-group/*:custom-meta[*:meta-name/text() eq 'peer-review-revision-round']/*:meta-value/text() castable as xs:integer and number(child::*:front-stub/*:custom-meta-group/*:custom-meta[*:meta-name/text() eq 'peer-review-revision-round']/*:meta-value/text()) ge 0 |
nlm-core-rule-334 | error | | JATS QA rules applying to metadata | sub-article/front-stub must contain a self-uri. | assert | *:sub-article | exists(child::*:front-stub/*:self-uri) |
nlm-core-rule-116 | error | | JATS QA rules applying to metadata | BITS QA rules applying to book and book-part metadata |
| Checks that subject collection code is present in applicable taxonomy. | assert | *:subject[parent::*:subj-group[@subj-group-type='category-taxonomy-collection'] ] | *:subject[parent::*:subj-group[@subj-group-type='category-taxonomy-collection'] ] |
| (if (document('helpers/jrn_taxonomy_lookup.xml')/taxonomyLookup/journal[ISSN = /*:article/*:front/*:journal-meta/*:issn[@pub-type='ppub'] or eISSN = if (local-name(/*) = 'article') then /*:article/*:front/*:journal-meta/*:issn[@pub-type='epub'] else /*:issue-meta/*:issue-identifier/*:issn[@pub-type = 'epub']]/taxonomy-name/text()) then ( for $jtn in document('helpers/jrn_taxonomy_lookup.xml')/taxonomyLookup/journal[ISSN = /*:article/*:front/*:journal-meta/*:issn[@pub-type='ppub'] or eISSN = if (local-name(/*) = 'article') then /*:article/*:front/*:journal-meta/*:issn[@pub-type='epub'] else /*:issue-meta/*:issue-identifier/*:issn[@pub-type = 'epub']]/taxonomy-name/text() return document( concat('helpers/journals-taxonomies/',$jtn,'.rdf'))/rdf:RDF ) else NULL,document(concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ), 'AcademicSubjects.rdf'))/rdf:RDF,document(concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ), 'Series.rdf'))/rdf:RDF,document(concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ), 'disorders.rdf'))/rdf:RDF,document(concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ), 'LanguageLevelCEFR.rdf'))/rdf:RDF,document(concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ), 'EducationalSector.rdf'))/rdf:RDF,document(concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ), 'EducationLearningConcept.rdf'))/rdf:RDF,document(concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ), 'Genre.rdf'))/rdf:RDF,document(concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ), 'Purpose.rdf'))/rdf:RDF)/rdf:Description[ matches( @rdf:about, concat('/',./text(),'$') ) ] |
nlm-core-rule-118 | error | | JATS QA rules applying to metadata | BITS QA rules applying to book and book-part metadata |
| Checks that subject collection code includes name of applicable taxonomy. | assert | *:subject[parent::*:subj-group[@subj-group-type='category-taxonomy-collection'] ] | *:subject[parent::*:subj-group[@subj-group-type='category-taxonomy-collection'] ] |
| (document('helpers/jrn_taxonomy_lookup.xml')/taxonomyLookup/journal[ISSN = /*:article/*:front/*:journal-meta/*:issn[@pub-type='ppub'] or eISSN = if (local-name(/*) = 'article') then /*:article/*:front/*:journal-meta/*:issn[@pub-type='epub'] else /*:issue-meta/*:issue-identifier/*:issn[@pub-type = 'epub']]/taxonomy-name/text()='Biology_Methods_and_Protocols' and tokenize(text(),'/')[1]='BiologyMethodsandProtocols') or tokenize(text(),'/')[1] = document('helpers/jrn_taxonomy_lookup.xml')/taxonomyLookup/journal[ISSN = /*:article/*:front/*:journal-meta/*:issn[@pub-type='ppub'] or eISSN = if (local-name(/*) = 'article') then /*:article/*:front/*:journal-meta/*:issn[@pub-type='epub'] else /*:issue-meta/*:issue-identifier/*:issn[@pub-type = 'epub']]/taxonomy-name/text() or tokenize(text(),'/')[1] = ('AcademicSubjects','disorders','Series','LanguageLevelCEFR','EducationalSectorISCED','EducationLearningConcept','Genre','Purpose') |
nlm-core-rule-126 | error | | JATS QA rules applying to metadata | Checks subject element representing a series title has a valid value. This rule checks against the PoolParty controlled vocabulary 'SeriesCategory'. | assert | *:subject[parent::*:subj-group[@subj-group-type='category-oup-series'] ] | . = document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'SeriesCategory.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)]/skos:prefLabel/text() |
nlm-core-rule-171 | error | | JATS QA rules applying to metadata | <subject> element of <subj-group subj-group-type="category-toc-heading"> must not exceed 255 characters. | report | *:subject[parent::*:subj-group[@subj-group-type='category-toc-heading'] ] | string-length() > 255 |
nlm-core-rule-192 | warning | | JATS QA rules applying to metadata | @article-type="correction" for corrections, corrigenda and errata. | report | *:subject[parent::*:subj-group[@subj-group-type='category-toc-heading'] ] | (starts-with(lower-case(.), 'correction') or starts-with(lower-case(.), 'corrigend') or starts-with(lower-case(.), 'errat')) and /*:article/@article-type!='correction' |
nlm-core-rule-56 | error | NLM-1-0057 | JATS QA rules applying to metadata | subj-group[@subj-group-type="category-toc-heading"] may have at most one child subject | report | *:subj-group | @subj-group-type='category-toc-heading' and count(child::*:subject) > 1 |
nlm-core-rule-84 | error | NLM-1-0089 | JATS QA rules applying to metadata | checks for correct maximum nesting of TOC headings | report | *:subj-group | ( @subj-group-type='category-toc-heading' and count(ancestor::*:subj-group) > 2 ) |
nlm-core-rule-104 | error | | JATS QA rules applying to metadata | <subject> within <subj-group subj-group-type="category-toc-heading"> must not contain an inline image. | report | *:subj-group | @subj-group-type = 'category-toc-heading' and child::*:subject/*:inline-graphic |
nlm-core-rule-125 | error | | JATS QA rules applying to metadata | Checks subj-group elements have the correct value of @subj-group-type. This rule checks against the PoolParty controlled vocabulary 'TaxonomyType'. | assert | *:subj-group | @subj-group-type = document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'TaxonomyType.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)]/skos:prefLabel/text() |
nlm-core-rule-154 | error | | JATS QA rules applying to metadata | <subj-group subj-group-type="category-guideline"> must contain one <subject> element, containing the text "Medical Guideline" or "Public Policy". | report | *:subj-group | @subj-group-type = 'category-guideline' and not( count(child::*:subject) = 1 and ( child::*:subject/text() = 'Medical Guideline' or child::*:subject/text() = 'Public Policy' ) ) |
nlm-core-rule-144 | error | | JATS QA rules applying to metadata | JATS and BITS QA rules applying to metadata | JATS and BITS QA rules applying to specified content elements and attributes |
| Checks that file extension for supplementary material is on the allowed list. This rule checks against the PoolParty controlled vocabulary 'FileType'. | assert | *:supplementary-material[parent::*:issue-meta] | *:self-uri[not(parent::*:book-meta/parent::*:book-part-wrapper)] | *:supplementary-material[not(parent::*:issue-meta or parent::*:book-meta/parent::*:book-part-wrapper)] | *:graphic | *:inline-graphic |
| not(contains(@xlink:href,'.')) or ( ( self::*:supplementary-material and lower-case( replace(@xlink:href,'^.+\.([^\.]+)$','$1') ) = (document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'FileType.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)][child::skos:broader[@rdf:resource = 'http://data.oup.com/taxonomy/FileType/1']]/skos:prefLabel/text(),document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'FileType.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)][child::skos:broader[@rdf:resource = 'http://data.oup.com/taxonomy/FileType/23']]/skos:prefLabel/text()) ) or ( (self::*:graphic or self::*:inline-graphic) and lower-case( replace(@xlink:href,'^.+\.([^\.]+)$','$1') ) = document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'FileType.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)][child::skos:broader[@rdf:resource = 'http://data.oup.com/taxonomy/FileType/23']]/skos:prefLabel/text() ) or ( self::*:self-uri and lower-case( replace(@xlink:href,'^.+\.([^\.]+)$','$1') ) = 'pdf' ) ) |
nlm-core-rule-153 | error | | JATS QA rules applying to metadata | JATS and BITS QA rules applying to metadata | JATS and BITS QA rules applying to specified content elements and attributes |
| A file name for a PDF version of an article or a supplementary data file must not contain a space character. | report | *:supplementary-material[parent::*:issue-meta] | *:self-uri[not(parent::*:book-meta/parent::*:book-part-wrapper)] | *:supplementary-material[not(parent::*:issue-meta or parent::*:book-meta/parent::*:book-part-wrapper)] | *:graphic | *:inline-graphic | *:media |
| contains(@xlink:href,' ') |
nlm-core-rule-169 | fatal-error | | JATS QA rules applying to metadata | JATS and BITS QA rules applying to metadata | JATS and BITS QA rules applying to specified content elements and attributes |
| Checks that files referenced exist on the filesystem. | report | *:supplementary-material[parent::*:issue-meta] | *:self-uri[not(parent::*:book-meta/parent::*:book-part-wrapper)] | *:supplementary-material[not(parent::*:issue-meta or parent::*:book-meta/parent::*:book-part-wrapper)] | *:graphic | *:inline-graphic |
| not( false() or //*:book-meta/*:custom-meta-group/*:custom-meta[*:meta-name/text() = 'is-proofing-stage']/*:meta-value/text() or oupfn:doc-available(concat('../Assets/', @xlink:href), base-uri()) or oupfn:doc-available(concat('Assets/', @xlink:href), base-uri()) or oupfn:doc-available(concat('assets/', @xlink:href), base-uri()) or oupfn:doc-available(concat('media/', @xlink:href), base-uri()) or oupfn:doc-available(concat('pdf/', @xlink:href), base-uri()) or oupfn:doc-available(concat('supplementary%20files/', @xlink:href), base-uri()) or oupfn:doc-available(concat('../issue_level_files/', @xlink:href), base-uri()) or oupfn:doc-available(concat('cover/', @xlink:href), base-uri()) or oupfn:doc-available(concat('chunked%20pdf/', @xlink:href), base-uri()) or oupfn:doc-available(concat('print%20pdf/', @xlink:href), base-uri()) or oupfn:doc-available(concat('print/', @xlink:href), base-uri()) or oupfn:doc-available(concat('figures/inline/', @xlink:href), base-uri()) or oupfn:doc-available(concat('q&a/', @xlink:href), base-uri()) or oupfn:doc-available(concat('ebook/', @xlink:href), base-uri()) or oupfn:doc-available(concat('MARC/', @xlink:href), base-uri()) or @xlink:href = tokenize(string(''),',\s*') ) |
nlm-core-rule-248 | error | | JATS QA rules applying to metadata | issue-meta TOC and supplementary material should not have duplicate entries. | report | *:supplementary-material[parent::*:issue-meta] | *:toc-content |
| @xlink:href = preceding::*/@xlink:href |
nlm-core-rule-123 | error | | JATS QA rules applying to metadata | Checks for correct structure of supplementary-material | assert | *:supplementary-material[not(parent::*:issue-meta)] | ( @id and @content-type = 'data-supplement' and @xlink:href and child::*:label ) or ( @id and (@content-type = 'featured-figure' or @content-type = 'featured-audio' or @content-type = 'featured-video') and child::*:graphic ) |
nlm-core-rule-241 | error | | JATS QA rules applying to metadata | A file name for a supplementary data file must not contain an apostrophe. | report | *:supplementary-material[not(parent::*:issue-meta)] | contains(@xlink:href,'''') |
nlm-core-rule-252 | error | | JATS QA rules applying to metadata | The value of the supplementary data label must match the filename minus the file extension. | report | *:supplementary-material[not(parent::*:issue-meta)] | *:label != substring-before(@xlink:href, '.') and not(@content-type = 'featured-figure' or @content-type = 'featured-audio' or @content-type = 'featured-video') |
nlm-core-rule-218 | error | | JATS QA rules applying to metadata | Checks that toc-content/@pub-id-type attribute has valid value. This rule checks against the PoolParty controlled vocabulary 'TOCIDType'. | assert | *:toc-content | @pub-id-type = document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'TOCIDType.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)]/skos:prefLabel/text() |
nlm-core-rule-129 | error | | JATS QA rules applying to metadata | Checks that @xml:lang attribute is used for translated abstracts. | assert | *:trans-abstract | @xml:lang |
nlm-core-rule-151 | error | | JATS QA rules applying to metadata | Article may have at most one subtitle. | assert | *:title-group | count(child::*:subtitle) <= 1 |
nlm-core-rule-20 | error | NLM-1-0019 | Journals JATS complex | JATS QA rules applying to article metadata only (not issue meta) |
| Checks valid types of pub-date | assert | *:pub-date[not(tokenize(namespace-uri(/*),'/')[last()] = 'SCJATS-journalissue.xsd')][ if ( oupfn:doc-available('issue_meta.xml', base-uri())) then true() else false() ] | *:pub-date[not(tokenize(namespace-uri(/*),'/')[last()] = 'SCJATS-journalissue.xsd')] |
| parent::*:issue-meta or ( @pub-type = 'epub' and count(../*:pub-date[@pub-type='epub']) = 1 and child::*:day and child::*:month ) or ( @pub-type='collection' and ../*:pub-date[@pub-type='epub'] and child::*:day and child::*:month ) or ( @pub-type = 'cover' and ../*:pub-date[@pub-type='epub'] ) |
nlm-core-rule-324 | error | | JATS and BITS QA rules applying to metadata | @iso-8601-date value must be a valid date. | assert | @iso-8601-date | (. castable as xs:date) or (. castable as xs:dateTime) |
nlm-core-rule-11 | error | NLM-1-0011 | JATS and BITS QA rules applying to metadata | Abstract may not contain a single sec. | assert | *:abstract | (count(child::*:sec) != 1 and not(child::*:p)) or (child::*:p and not(child::*:sec)) |
nlm-core-rule-12 | error | NLM-1-0012 | JATS and BITS QA rules applying to metadata | Checks for presence of @abstract-type or @specific-use with correct value. This rule checks against the PoolParty controlled vocabulary 'AbstractType'. | assert | *:abstract | @abstract-type = document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'AbstractType.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)]/skos:prefLabel/text() or exists(/comment()[matches(.,'Converted to\s+(SC|)BITS')]) or @specific-use = 'layperson' |
nlm-core-rule-119 | error | | JATS and BITS QA rules applying to metadata | JATS and BITS QA rules applying to specified content elements and attributes | JATS QA rules applying to specified content elements and attributes |
| Checks that element has a title. Exception: abstract with @abstract-type of "teaser". | assert | *:abstract | *:ack | *:ref-list | *:sec[parent::*:abstract] |
| child::*:title or (self::*:abstract and @abstract-type = 'teaser') |
nlm-core-rule-167 | warning | | JATS and BITS QA rules applying to metadata | Warn if article abstract does not start with a word character. | report | *:abstract | (@abstract-type='abstract' or @abstract-type='teaser' or @specific-use='layperson') and (child::*:p|child::*:sec/*:p)[1][not(matches(normalize-space(string()),'^[\w|"|‘|“|“]'))] |
nlm-core-rule-243 | error | | JATS and BITS QA rules applying to metadata | There should not be more than one abstract with @abstract-type='abstract'. | report | *:abstract | @abstract-type='abstract' and following-sibling::*:abstract[@abstract-type='abstract'] |
nlm-core-rule-344 | error | | JATS and BITS QA rules applying to metadata | Checks if abstract contains xref or related-object element. | report | *:abstract | descendant::*:xref or descendant::*:related-object |
nlm-core-rule-133 | error | | JATS and BITS QA rules applying to metadata | Flags if aff or corresp in article metadata has a label child. | report | | self::node()[ (self::*:aff and parent::*:article-meta) or parent::*:author-notes ] [child::*:label] |
nlm-core-rule-162 | error | | JATS and BITS QA rules applying to metadata | aff elements must not contain the patterns "Current address", "Present address", "On behalf of". | report | *:aff | matches( string(), '(([Pp]resent|[Cc]urrent) address|[Oo]n behalf of)' ) |
nlm-core-rule-206 | error | | JATS and BITS QA rules applying to metadata | The aff element must not contain an xref with @ref-type="aff". | report | *:aff | descendant::*:xref[@ref-type = 'aff'] |
nlm-core-rule-253 | warning | | JATS and BITS QA rules applying to metadata | An aff element should contain an institution element. | assert | *:aff | exists(child::*:institution) |
nlm-core-rule-172 | error | | JATS and BITS QA rules applying to metadata | Checks element has @id | report | *:author-notes | @id |
nlm-core-rule-321 | error | | JATS and BITS QA rules applying to metadata | JATS and BITS QA rules applying to specified content elements and attributes |
| Checks that author-notes does not have a direct child p, as this may cause the text to display within the Extract in the issue TOC. The p should be within a fn or corresp element. Now checks fig as well. | report | | .[child::*:p] |
nlm-core-rule-146 | error | | JATS and BITS QA rules applying to metadata | Checks that award-group element has @award-type="grant". | assert | *:award-group | @award-type = 'grant' |
nlm-core-rule-26 | error | NLM-1-0026 | JATS and BITS QA rules applying to metadata | contrib must not have both have a collab child and a name child. | report | *:contrib | child::*:name and child::*:collab |
nlm-core-rule-27 | error | NLM-1-0026 | JATS and BITS QA rules applying to metadata | contrib should have either a single collab child or a single name or name-alternatives (with optional translations of that name). | assert | *:contrib | count(child::*:collab) = 1 or count(child::*:name-alternatives) = 1 or count(child::*:name[not(@xml:lang)]) = 1 |
nlm-core-rule-120 | error | | JATS and BITS QA rules applying to metadata | Checks contrib elements have the correct value of @contrib-type. This rule checks against the PoolParty controlled vocabulary 'ContributorType'. | assert | *:contrib | @contrib-type = document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'ContributorType.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)]/skos:prefLabel/text() |
nlm-core-rule-179 | error | | JATS and BITS QA rules applying to metadata | Checks that contrib element contains the correct child elements (name, name-alternatives, or collab). Also checks child elements of name and collab. | assert | *:contrib | child::*:name[child::*:given-names and child::*:surname] or child::*:collab[child::*:contrib-group or not(exists(/*:article))] or child::*:name[child::*:surname] or child::*:name-alternatives |
nlm-core-rule-183 | error | | JATS and BITS QA rules applying to metadata | Checks role elements have the correct value. | report | *:contrib | @contrib-type = 'author' and child::*:role[contains(., 'ditor')] |
nlm-core-rule-265 | error | | JATS and BITS QA rules applying to metadata | A contributor's address must not be captured using the address element. | report | *:contrib | child::*:address |
nlm-core-rule-110 | error | | JATS and BITS QA rules applying to metadata | Element 'contrib-group' occurring inside 'collab' may not contain descendant 'collab' elements | report | *:contrib-group | ancestor::*:collab and descendant::*:collab |
nlm-core-rule-300 | error | | JATS and BITS QA rules applying to metadata | A contrib-group element may only have child contrib or on-behalf-of elements. Aff elements must be captured within the relevant contrib element. | assert | *:contrib-group | not(.[following-sibling::aff]) and (every $c in child::* satisfies $c[self::*:contrib or self::*:on-behalf-of]) |
nlm-core-rule-111 | error | | JATS and BITS QA rules applying to metadata | ORCID ID validity check. An ORCID ID consists of four 4-digit strings
separated by hyphens. The last checksum digit may be "X". ORCID may not be https://orcid.org/0000-0000-0000-0000. | report | *:contrib-id | @contrib-id-type = 'orcid' and ( matches(.,'^https://orcid.org/0000\-0000\-0000\-000[0X]$') or not( matches( ., '^https://orcid.org/\d\d\d\d\-\d\d\d\d\-\d\d\d\d\-\d\d\d[\dX]$' ) ) ) |
nlm-core-rule-240 | error | | JATS and BITS QA rules applying to metadata | ORCIDs must be unique. Please check that the ORCID values are correct. | report | *:contrib-id | @contrib-id-type = 'orcid' and text() = ./parent::*:contrib/preceding-sibling::*:contrib[not(deep-equal(*:name,current()/parent::*:contrib/*:name))]/*:contrib-id[@contrib-id-type = 'orcid'] |
nlm-core-rule-208 | error | | JATS and BITS QA rules applying to metadata | The copyright statement must not contain the text "Creative Commons" or "license". | report | *:copyright-statement | contains(string(), 'Creative Commons') or contains(string(), 'license') |
nlm-core-rule-28 | error | NLM-1-0027 | JATS and BITS QA rules applying to metadata | Checks year and copyright-year for valid year range (between 1700 and 2100). | report | | not( ancestor::*:citation or ancestor::*:nlm-citation or ancestor::*:mixed-citation or ancestor::*:element-citation or ancestor::*:product ) and ( string( translate( ., 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', '' ) ) = 'NaN' or number( translate( ., 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', '' ) ) > 2100 or number( translate( ., 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', '' ) ) < 1700 or matches(., '\W') ) |
nlm-core-rule-32 | error | NLM-1-0032 | JATS QA rules applying to metadata | JATS and BITS QA rules applying to metadata | JATS and BITS QA rules applying to specified content elements and attributes | BITS QA rules applying to specified content elements and attributes |
| Checks element has @id | assert | *:related-article | *:sec[parent::*:abstract] | *:corresp | *:supplementary-material[not(parent::*:issue-meta or parent::*:book-meta/parent::*:book-part-wrapper)] | *:ack | *:fn | mml:math | *:ref | *:ref-list | *:table-wrap | *:tex-math | *:ack | *:book-app | *:book-part | *:boxed-text | *:fig | *:fig-group | *:front-matter-part | *:index | *:index-group | *:ref-list | *:sec |
| exists(/comment()[matches(.,'Converted to\s+(SC|)BITS')]) or (exists(@id) and string(@id) ne '') |
nlm-core-rule-130 | error | | JATS QA rules applying to metadata | JATS and BITS QA rules applying to metadata | JATS and BITS QA rules applying to specified content elements and attributes |
| Flags if no xref or related-object is found which targets the aff, corresp, or fn element. | assert | | @id = //*:xref/@rid or @id = //*:related-object/@object-id or self::*:fn[parent::*:table-wrap-foot] or self::*:aff[parent::*:contrib] |
nlm-core-rule-254 | error | | JATS and BITS QA rules applying to metadata | The value of the @country attribute must be a valid ISO 3166 code | assert | *:country | @country = document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'Countries.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)]/csm:iso_3166_alpha2_code/text() |
nlm-core-rule-29 | error | NLM-1-0028 | JATS and BITS QA rules applying to metadata | Dates with days specified must also specify a month. | report | | child::*:day and not(child::*:month) |
nlm-core-rule-30 | error | NLM-1-0029 | JATS and BITS QA rules applying to metadata | Checks that days in dates are integers between 1 and 31 inclusive | report | | child::*:day[ not( ancestor::*:citation or ancestor::*:nlm-citation or ancestor::*:mixed-citation or ancestor::*:element-citation or ancestor::*:product ) and not( number(.) > 0 and number(.) < 32 ) ] |
nlm-core-rule-31 | error | NLM-1-0030 | JATS and BITS QA rules applying to metadata | Months in dates must be captured as an integer between 1 and 12 (inclusive). | report | | not(@pub-type = 'cover') and child::*:month[ not( ancestor::*:citation or ancestor::*:nlm-citation or ancestor::*:mixed-citation or ancestor::*:element-citation or ancestor::*:product ) and not( number(.) > 0 and number(.) < 13 ) ] |
nlm-core-rule-318 | error | | JATS and BITS QA rules applying to metadata | The degrees element must be placed immediately after the contributor name. | assert | *:degrees | .[preceding-sibling::*[1][self::*:name]] |
nlm-core-rule-245 | error | | JATS and BITS QA rules applying to metadata | Edition element cannot contain more than 15 characters. | report | *:edition | ancestor::*:mixed-citation and (string-length(.) > 15 or string-length(.) = 0) |
nlm-core-rule-42 | error | NLM-1-0042 | JATS and BITS QA rules applying to metadata | Checks that there is an lpage element if there is an fpage element | report | *:fpage | parent::*[self::*:article-meta or self::*:book-part-meta] and not(following-sibling::*:lpage) |
nlm-core-rule-79 | error | NLM-1-0084 | JATS and BITS QA rules applying to metadata | Checks that there are no / or \ characters in fpage or elocation-id
elements. | report | *:fpage | parent::*[self::*:article-meta or self::*:book-part-meta] and matches(., '[\\/]') |
nlm-core-rule-242 | error | | JATS and BITS QA rules applying to metadata | Checks that fpage is not larger than lpage. | report | *:fpage | parent::*[self::*:article-meta or self::*:book-part-meta] and not(matches(., '\D')) and not(matches(following-sibling::*:lpage, '\D')) and number(.) > number(following-sibling::*:lpage) |
nlm-core-rule-246 | error | | JATS and BITS QA rules applying to metadata | volume, issue, fpage and lpage elements cannot contain more than 32 characters, or 0 characters. | report | *:fpage | *:issue | *:lpage | *:volume |
| ancestor::*:mixed-citation and (string-length(.) > 32 or string-length(.) = 0) |
nlm-core-rule-142 | error | | JATS and BITS QA rules applying to metadata | Checks that funder identifier is present alongside funder name. | report | *:funding-source | child::*:institution-wrap/*:institution[exists(document('helpers/fundref_registry.rdf')/rdf:RDF/skos:Concept[(skosxl:prefLabel|skosxl:altLabel)/skosxl:Label/skosxl:literalForm[text() = normalize-space( child::*:institution-wrap/*:institution ) ]] /@rdf:about )] and ( not(child::*:institution-wrap/*:institution-id) or normalize-space(child::*:institution-wrap/*:institution-id) = '' ) |
nlm-core-rule-143 | warning | | JATS and BITS QA rules applying to metadata | Checks that funder identifier is present alongside funder name and matches value in FundRef registry. | report | *:funding-source | normalize-space( child::*:institution-wrap/*:institution ) and normalize-space( child::*:institution-wrap/*:institution-id ) and not( document('helpers/fundref_registry.rdf')/rdf:RDF/skos:Concept[ (skosxl:prefLabel|skosxl:altLabel)/skosxl:Label/skosxl:literalForm/text() = normalize-space( child::*:institution-wrap/*:institution ) ][not(child::*:isReplacedBy)] /substring-after(@rdf:about, 'doi.org/') = normalize-space( child::*:institution-wrap/*:institution-id )) |
nlm-core-rule-159 | error | | JATS and BITS QA rules applying to metadata | A funding source in an OA article must not contain a 'release-delay' processing instruction. | report | *:funding-source | if (/*:article/*:front/*:article-meta/*:permissions/*:license[starts-with(@license-type,'cc-')]) then true() else false() and child::processing-instruction('release-delay')[string() = '12|0' or string() = '0|0'] |
nlm-core-rule-274 | error | | JATS and BITS QA rules applying to metadata | A funding-source element must contain a institution-wrap element. | assert | *:funding-source | child::*:institution-wrap |
nlm-core-rule-335 | error | | JATS and BITS QA rules applying to metadata | For Funding capture, the value of @institution-id-type must be "DOI" in all caps. | assert | *:institution-id | ./@institution-id-type[matches(.,'^DOI$')] |
nlm-core-rule-160 | error | | JATS QA rules applying to metadata | JATS and BITS QA rules applying to metadata | JATS and BITS QA rules applying to specified content elements and attributes | BITS QA rules applying to specified content elements and attributes |
| Certain elements (e.g. titles in abstracts, keywords, affiliations) should not end with punctuation or spaces. | assert | *:aff | *:degrees | *:kwd | *:title | *:label |
| self::*:title[not(parent::*:sec/ancestor::*:abstract)] or self::*:label[not(parent::*:sec or parent::*:title-group)] or not(matches(normalize-space(string()),'[,\.;:\-–—]$')) |
nlm-core-rule-210 | warning | | JATS and BITS QA rules applying to metadata | A single keyword containing a ',' or ';' character is reported as a possible keyword list. | report | *:kwd-group | count(child::*:kwd) = 1 and ( contains(normalize-space(child::*:kwd), ',') or contains(normalize-space(child::*:kwd), ';') ) |
nlm-core-rule-94 | error | NLM-1-0098 | JATS and BITS QA rules applying to metadata | license element with creative commons @license-type must have a @xlink:href attribute whose value appears in the element's content. | report | *:license[not(ancestor::fig or ancestor::table-wrap or ancestor::graphic or ancestor::inline-graphic)] | parent::*:permissions/parent::*:article-meta and ( @license-type = 'creative-commons' or @license-type = 'open-access' or @license-type = 'cc-by' or @license-type = 'cc-by-nd' or @license-type = 'cc-by-nc-sa' or @license-type = 'cc-by-sa' or @license-type = 'cc-by-nc' or @license-type = 'cc-by-nc-nd' or @license-type = 'cc-by-igo' ) and ( not( @xlink:href and @xlink:href != '' ) or not( contains(string-join(descendant::text(),''), @xlink:href) ) ) |
nlm-core-rule-136 | error | | JATS and BITS QA rules applying to metadata | Checks for presence of @license-type with correct value. This rule checks against the PoolParty controlled vocabulary 'LicenseType'. | assert | *:license[not(ancestor::fig or ancestor::table-wrap or ancestor::graphic or ancestor::inline-graphic)] | @license-type = document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'LicenseType.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)]/skos:prefLabel/text() |
nlm-core-rule-164 | error | | JATS and BITS QA rules applying to metadata | In Open Access articles, the @xlink:href attribute of the license element must match that of its descendant ext-link element. | report | *:license[not(ancestor::fig or ancestor::table-wrap or ancestor::graphic or ancestor::inline-graphic)] | if (/*:article/*:front/*:article-meta/*:permissions/*:license[starts-with(@license-type,'cc-')]) then true() else false() and not( @xlink:href = descendant::*:ext-link/@xlink:href ) |
nlm-core-rule-88 | error | NLM-1-0094a | JATS and BITS QA rules applying to metadata | Publication date must be a valid ISO 8601 date (YYYY-MM-DD). | report | *:pub-date | ( child::*:year and child::*:month and child::*:day ) and not( oupfn:is-valid-ISO8601-date( concat( *:year, '-', *:month, '-', *:day) ) ) |
nlm-core-rule-89 | error | NLM-1-0094b | JATS and BITS QA rules applying to metadata | Publication date must be a valid ISO 8601 date (YYYY-MM). | report | *:pub-date | not(@pub-type = 'cover') and ( child::*:year and child::*:month and not(child::*:day) ) and not( oupfn:is-valid-ISO8601-date( concat( *:year, '-', *:month ) ) ) |
nlm-core-rule-90 | error | NLM-1-0094c | JATS and BITS QA rules applying to metadata | Publication date must be a valid ISO 8601 date (YYYY). | report | *:pub-date | ( child::*:year and not(child::*:month) and not(child::*:day) ) and not( oupfn:is-valid-ISO8601-date(*:year) ) |
nlm-core-rule-157 | error | NLM-1-0094a | JATS and BITS QA rules applying to metadata | Element pub-date where @pub-type="epub" or "collection" must have an @iso-8601-date attribute whose value corresponds to the contents of the day, month, and year children. Compare nlm-core-rule-88 and nlm-core-rule-20 | report | *:pub-date | ( @pub-type = ('epub','collection') or @publication-format = ('epub','ppub') or parent::*:event ) and ( not(@iso-8601-date) or not( starts-with(@iso-8601-date, concat( *:year, '-', *:month, '-', *:day) ) ) ) |
nlm-core-rule-219 | error | | JATS and BITS QA rules applying to metadata | Checks that pub-date/@publication-format attribute has valid value. This rule checks against the PoolParty controlled vocabulary 'BookPubDateType'. | assert | *:pub-date | @publication-format = document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'BookPubDateType.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)]/skos:prefLabel/text() or exists(@pub-type) or parent::*:event |
nlm-core-rule-100 | error | NLM-1-0103b | JATS QA rules applying to metadata | JATS and BITS QA rules applying to metadata | JATS and BITS QA rules applying to specified content elements and attributes |
| ArXiv ID validity check. An ArXiv ID starts with "arXiv:". | report | *:article-id | *:pub-id | *:ref |
| @pub-id-type = 'arxiv' and not( starts-with(., 'arXiv:') ) |
nlm-core-rule-217 | error | | JATS and BITS QA rules applying to metadata | Checks that pub-id/@pub-id-type attribute has valid value. This rule checks against the PoolParty controlled vocabulary 'BibRefIDType'. | assert | *:pub-id | @pub-id-type = document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'BibRefIDType.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)]/skos:prefLabel/text() |
nlm-core-rule-222 | error | | JATS and BITS QA rules applying to metadata | Checks that related-object attribute has complete collection of attributes. | assert | *:related-object | ( exists(@document-id) and exists(@document-id-type) and exists(@document-type) and empty(@object-id) and empty(@object-id-type) and empty(@object-type) and empty(@source-id) and empty(@source-id-type) and empty(@source-type) ) or ( exists(@source-id) and exists(@source-id-type) and exists(@source-type) and exists(@document-type) and empty(@object-id) and empty(@object-id-type) and empty(@object-type) and empty(@document-id) and empty(@document-id-type) ) or ( exists(@object-id) and exists(@object-id-type) and exists(@object-type) and exists(@document-id) and exists(@document-id-type) and exists(@document-type) and empty(@source-id) and empty(@source-id-type) and empty(@source-type) ) |
nlm-core-rule-223 | error | | JATS and BITS QA rules applying to metadata | Checks that related-object/@document-type attribute has valid value. This rule checks against the PoolParty controlled vocabulary 'RelatedObjectDocType'. | assert | *:related-object | @document-type = document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'RelatedObjectDocType.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)]/skos:prefLabel/text() or not(exists(@document-type)) |
nlm-core-rule-224 | error | | JATS and BITS QA rules applying to metadata | Checks that related-object/@document-id-type attribute has valid value. This rule checks against the PoolParty controlled vocabulary 'RelatedObjectDocIDType'. | assert | *:related-object | @document-id-type = document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'RelatedObjectDocIDType.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)]/skos:prefLabel/text() or not(exists(@document-id-type)) |
nlm-core-rule-225 | error | | JATS and BITS QA rules applying to metadata | Checks that related-object/@source-type attribute has valid value. This rule checks against the PoolParty controlled vocabulary 'RelatedObjectURLType'. | assert | *:related-object | @source-type = document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'RelatedObjectURLType.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)]/skos:prefLabel/text() or not(exists(@source-type)) |
nlm-core-rule-226 | error | | JATS and BITS QA rules applying to metadata | Checks that related-object/@source-id-type attribute has valid value. This rule checks against the PoolParty controlled vocabulary 'RelatedObjectURLIDType'. | assert | *:related-object | @source-id-type = document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'RelatedObjectURLIDType.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)]/skos:prefLabel/text() or not(exists(@source-id-type)) |
nlm-core-rule-227 | error | | JATS and BITS QA rules applying to metadata | Checks that related-object/@object-type attribute has valid value. This rule checks against the PoolParty controlled vocabulary 'RelatedObjectType'. | assert | *:related-object | @object-type = document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'RelatedObjectType.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)]/skos:prefLabel/text() or not(exists(@object-type)) |
nlm-core-rule-228 | error | | JATS and BITS QA rules applying to metadata | Checks that related-object/@object-id-type attribute has valid value. This rule checks against the PoolParty controlled vocabulary 'RelatedObjectIDType'. | assert | *:related-object | @object-id-type = document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'RelatedObjectIDType.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)]/skos:prefLabel/text() or not(exists(@object-id-type)) |
nlm-core-rule-144 | error | | JATS QA rules applying to metadata | JATS and BITS QA rules applying to metadata | JATS and BITS QA rules applying to specified content elements and attributes |
| Checks that file extension for supplementary material is on the allowed list. This rule checks against the PoolParty controlled vocabulary 'FileType'. | assert | *:supplementary-material[parent::*:issue-meta] | *:self-uri[not(parent::*:book-meta/parent::*:book-part-wrapper)] | *:supplementary-material[not(parent::*:issue-meta or parent::*:book-meta/parent::*:book-part-wrapper)] | *:graphic | *:inline-graphic |
| not(contains(@xlink:href,'.')) or ( ( self::*:supplementary-material and lower-case( replace(@xlink:href,'^.+\.([^\.]+)$','$1') ) = (document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'FileType.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)][child::skos:broader[@rdf:resource = 'http://data.oup.com/taxonomy/FileType/1']]/skos:prefLabel/text(),document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'FileType.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)][child::skos:broader[@rdf:resource = 'http://data.oup.com/taxonomy/FileType/23']]/skos:prefLabel/text()) ) or ( (self::*:graphic or self::*:inline-graphic) and lower-case( replace(@xlink:href,'^.+\.([^\.]+)$','$1') ) = document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'FileType.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)][child::skos:broader[@rdf:resource = 'http://data.oup.com/taxonomy/FileType/23']]/skos:prefLabel/text() ) or ( self::*:self-uri and lower-case( replace(@xlink:href,'^.+\.([^\.]+)$','$1') ) = 'pdf' ) ) |
nlm-core-rule-153 | error | | JATS QA rules applying to metadata | JATS and BITS QA rules applying to metadata | JATS and BITS QA rules applying to specified content elements and attributes |
| A file name for a PDF version of an article or a supplementary data file must not contain a space character. | report | *:supplementary-material[parent::*:issue-meta] | *:self-uri[not(parent::*:book-meta/parent::*:book-part-wrapper)] | *:supplementary-material[not(parent::*:issue-meta or parent::*:book-meta/parent::*:book-part-wrapper)] | *:graphic | *:inline-graphic | *:media |
| contains(@xlink:href,' ') |
nlm-core-rule-169 | fatal-error | | JATS QA rules applying to metadata | JATS and BITS QA rules applying to metadata | JATS and BITS QA rules applying to specified content elements and attributes |
| Checks that files referenced exist on the filesystem. | report | *:supplementary-material[parent::*:issue-meta] | *:self-uri[not(parent::*:book-meta/parent::*:book-part-wrapper)] | *:supplementary-material[not(parent::*:issue-meta or parent::*:book-meta/parent::*:book-part-wrapper)] | *:graphic | *:inline-graphic |
| not( false() or //*:book-meta/*:custom-meta-group/*:custom-meta[*:meta-name/text() = 'is-proofing-stage']/*:meta-value/text() or oupfn:doc-available(concat('../Assets/', @xlink:href), base-uri()) or oupfn:doc-available(concat('Assets/', @xlink:href), base-uri()) or oupfn:doc-available(concat('assets/', @xlink:href), base-uri()) or oupfn:doc-available(concat('media/', @xlink:href), base-uri()) or oupfn:doc-available(concat('pdf/', @xlink:href), base-uri()) or oupfn:doc-available(concat('supplementary%20files/', @xlink:href), base-uri()) or oupfn:doc-available(concat('../issue_level_files/', @xlink:href), base-uri()) or oupfn:doc-available(concat('cover/', @xlink:href), base-uri()) or oupfn:doc-available(concat('chunked%20pdf/', @xlink:href), base-uri()) or oupfn:doc-available(concat('print%20pdf/', @xlink:href), base-uri()) or oupfn:doc-available(concat('print/', @xlink:href), base-uri()) or oupfn:doc-available(concat('figures/inline/', @xlink:href), base-uri()) or oupfn:doc-available(concat('q&a/', @xlink:href), base-uri()) or oupfn:doc-available(concat('ebook/', @xlink:href), base-uri()) or oupfn:doc-available(concat('MARC/', @xlink:href), base-uri()) or @xlink:href = tokenize(string(''),',\s*') ) |
nlm-core-rule-55 | error | NLM-1-0056 | JATS and BITS QA rules applying to metadata | subject element may not contain formatting or linking elements. | report | *:subject | ( .//*:bold or .//*:monospace or .//*:overline or .//*:sc or .//*:strike or .//*:underline or .//*:xref ) |
nlm-core-rule-3 | error | NLM-1-0003 | JATS QA rules applying to metadata | JATS and BITS QA rules applying to metadata | JATS and BITS QA rules applying to specified content elements and attributes |
| Certain elements may not contain only typographic formatting | assert | *:article-title | *:subtitle | *:p | *:title |
| not(doc-available('helpers/scout/Publishers.rdf')) or self::*:p[not( ancestor::*:caption or ancestor::*:abstract )] or self::*:subtitle[ ancestor::*[ self::*:citation or self::*:product or self::*:element-citation or self::*:mixed-citation or self::*:nlm-core-abstract-rule-citation ] ] or self::*:title[count(child::*) = 0 and normalize-space(string(.)) = ''] or child::text()[normalize-space(.) != ''] or child::*[ not( self::*:italic or self::*:bold or self::*:sc or self::*:sup or self::*:sub ) ] or child::*/child::node()[normalize-space() !=''] [position() = 1 or position() = last()] [self::*:xref] |
nlm-core-rule-3b | error | | JATS and BITS QA rules applying to metadata | Certain elements may not contain only typographic formatting | report | *:subtitle | not(doc-available('helpers/scout/Publishers.rdf')) and not( child::text()[normalize-space(.) != ''] ) |
nlm-core-rule-258 | error | | JATS and BITS QA rules applying to metadata | @mimetype attribute of graphic, inline-graphic, or supplementary-material must have value "application", "audio", "video", "image", "model", or "text". This rule checks against the PoolParty controlled vocabulary 'MIMEType'. | assert | *:supplementary-material[not(parent::*:issue-meta or parent::*:book-meta/parent::*:book-part-wrapper)] | child::*:graphic/@mimetype or (@mimetype = document( concat( if (doc-available('poolparty/Publishers.rdf')) then 'poolparty/' else ( if (not(doc-available('helpers/scout/Publishers.rdf'))) then '/docs/' else 'helpers/scout/' ),'MIMEType.rdf') )/rdf:RDF/rdf:Description[oupca:isTaxonomyNode(.)][child::skos:broader[@rdf:resource = 'http://data.oup.com/taxonomy/MIMEType/9']]/skos:prefLabel/text()) |
nlm-core-rule-266 | error | | BITS QA rules applying to book and book-part metadata | JATS and BITS QA rules applying to metadata |
| An alt-title is not required. | report | *:book-title-group | *:title-group |
| child::*:alt-title |
nlm-core-rule-270 | error | | BITS QA rules applying to book and book-part metadata | JATS and BITS QA rules applying to metadata |
| <inline-formula> is not permitted within book, chapter or article titles. | report | *:book-title-group | *:title-group |
| (empty(//*:collection-meta[@collection-type = 'set']/*:collection-id/text()) or not(self::*:book-title)) and descendant::*:inline-formula |
jrn-issue-meta-core-rule-1 | information | | Journals issue metadata | Sanity Check - make sure Schematron rules are running. | report | *:issue-meta | self::*:issue-meta |
jrn-issue-meta-core-rule-2 | error | | Journals issue metadata | An issue meta file may not contain both an attribute @dynamic-toc-type="topic-driven" and a table-of-contents element.
| report | *:issue-meta | @dynamic-toc-type = 'topic-driven' and child::*:table-of-contents |
jrn-issue-meta-core-rule-4 | error | | Journals issue metadata | If an issue meta file has issue @content-type="supplement", then it must have <issue-type>supplemental</issue-type>.
| report | *:issue-meta | descendant::*:issue[contains(., 'uppl')] and not(*:issue-type= 'supplemental') |
jrn-issue-meta-core-rule-5 | warning | | Journals issue metadata | Issue meta files may have either a ppub pub-date or collection pub-date, but never both. | report | *:issue-meta | child::*:pub-date[@pub-type='ppub'] and child::*:pub-date[@pub-type='collection'] |
jrn-issue-meta-core-rule-6 | error | | Journals issue metadata | Issue meta files must not have an epub pub-date. | report | *:issue-meta | child::*:pub-date[@pub-type='epub'] |
jrn-issue-meta-core-rule-7 | error | | Journals issue metadata | Issue meta files must have a valid journal code. | assert | *:issue-meta | child::*:journal-id/text() = document('helpers/journals-metadata/journals-master-list.xml')/jml:journals-master-list/jml:journal/jml:oup_code/text() |
jrn-issue-meta-core-rule-8 | error | | Journals issue metadata | Issue meta file containing a full issue PDF self-uri link is only allowed when issue is supplemental | report | *:issue-meta | descendant::*:self-uri and not(*:issue-type= 'supplemental') |
jrn-issue-meta-core-rule-9 | error | | Journals issue metadata | Issue meta files must use v1.42 of SCJATS. | assert | *:issue-meta | namespace-uri() = 'http://specifications.silverchair.com/xsd/1/42/SCJATS-journalissue-mathml3.xsd' |