Rule IDFlagProbe IDProductsDescriptionTypeContextsXPath
nlm-core-rule-103informationNLM-3-0000JATS QA rules applying to the root elementSanity Check - make sure Schematron rules are running.report/*[self::*:article].
nlm-core-rule-291errorJATS QA rules applying to the root elementChecks 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-1errorNLM-1-0001JATS and BITS QA rules applying to all elementsNo 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-5errorJATS and BITS QA rules applying to DOIsDOIs 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-4errorNLM-1-0004JATS and BITS QA rules applying to DOIsDOIs 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-23errorJATS and BITS QA rules applying to DOIsDOIs 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-24errorJATS and BITS QA rules applying to DOIsDOIs 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-38errorJATS and BITS QA rules applying to DOIsDOIs 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-25errorJATS and BITS QA rules applying to DOIsDOIs must be unique.report*[@book-part-id-type = 'doi'] text() = preceding::*[@book-id-type = 'doi' or @book-part-id-type = 'doi']
nlm-core-rule-309errorJATS and BITS QA rules applying to specified content elements and attributesMathML must not contain deprecated @fontsize, @fontweight, @fontstyle, @fontfamily, @color, @background attributes.report@fontsize|@fontstyle|@fontweight|@fontfamily|@color|@backgroundnot(parent::mml:mglyph)
nlm-core-rule-306errorJATS and BITS QA rules applying to specified content elements and attributesMathML 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|@minlabelspacingmatches(.,'^((-?([0-9]+|[0-9]*\.[0-9]+)*(em|ex|px|in|cm|mm|pt|pc|%))|0)$')
nlm-core-rule-307errorJATS and BITS QA rules applying to specified content elements and attributesMathML length regex is defined in schema file common-types.xsd. Also uses values for "simple-size"assert@mathsizematches(.,'^((-?([0-9]+|[0-9]*\.[0-9]+)*(em|ex|px|in|cm|mm|pt|pc|%))|0|small|normal|big)$')
nlm-core-rule-213errorJATS and BITS QA rules applying to specified content elements and attributesChecks 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-316errorJATS and BITS QA rules applying to specified content elements and attributesMathML @notation values are defined in MathML spec.assertmml:menclose/@notation. = ( 'actuarial', 'longdiv', 'radical', 'box', 'roundedbox', 'circle', 'left', 'right', 'top', 'bottom', 'updiagonalstrike', 'downdiagonalstrike', 'verticalstrike', 'horizontalstrike' )
nlm-core-rule-308errorJATS and BITS QA rules applying to specified content elements and attributesMathML length regex is defined in schema file common-types.xsd. Also uses values for "named-space".assertmml:*/@width|mml:*/@lspace|mml:*/@rspace|mml:*/@minsize|mml:*/@maxsizematches(.,'^((-?([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-2errorNLM-1-0002JATS and BITS QA rules applying to specified content elements and attributes @xlink:href must be non-empty. assert@xlink:hrefnormalize-space(string(.)) != ''
nlm-core-rule-35errorNLM-1-0035JATS and BITS QA rules applying to specified content elements and attributesChecks 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-202errorJATS and BITS QA rules applying to specified content elements and attributesSupplementary 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-203error
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
*:article-id
@xlink:href
. = normalize-space(.)
nlm-core-rule-32errorNLM-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 @idassert
*: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-119error
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-302errorJATS and BITS QA rules applying to specified content elements and attributesalt-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-323errorJATS and BITS QA rules applying to specified content elements and attributesalt-text element must be a child of graphic.assert*:alt-textparent::*:graphic or parent::*:inline-graphic or parent::*:supplementary-material[@content-type eq 'affiliate-logo']
nlm-core-rule-21errorNLM-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
*:back
*:book-back
child::*:title or child::*:label
nlm-core-rule-96errorNLM-1-0100bJATS 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-98errorJATS and BITS QA rules applying to specified content elements and attributesThe 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-152errorJATS and BITS QA rules applying to specified content elements and attributesA 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-121error
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 usedreport
*:element-citation
*:response
self::*
nlm-core-rule-36errorNLM-1-0036JATS and BITS QA rules applying to specified content elements and attributesChecks 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-155errorJATS and BITS QA rules applying to specified content elements and attributesCheck that @xlink:href starts "http://" or "https://" for particular values of @ext-link-typereport*: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-173warningJATS and BITS QA rules applying to specified content elements and attributesChecks for license element when book or journal article has a link to creativecommons.orgreport
*:ext-link
*:uri
(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-283error
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-321error
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
*:author-notes
*:fig
.[child::*:p]
nlm-core-rule-38errorNLM-1-0038JATS 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-39errorNLM-1-0039JATS and BITS QA rules applying to specified content elements and attributesChecks that table footnotes are in the table footreport*:fnancestor::*:table-wrap and not(parent::*:table-wrap-foot)
nlm-core-rule-130error
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
*:aff
*:corresp
*:fn
@id = //*:xref/@rid or @id = //*:related-object/@object-id or self::*:fn[parent::*:table-wrap-foot] or self::*:aff[parent::*:contrib]
nlm-core-rule-139errorJATS and BITS QA rules applying to specified content elements and attributesChecks for presence of title "Footnotes" or "Endnotes" in fn-group.assert*:fn-groupchild::*:title[. = 'Footnotes' or . = 'Endnotes' or . = 'Notes']
nlm-core-rule-194warningJATS and BITS QA rules applying to specified content elements and attributesChecks for presence of title "Endnotes" in fn-group. This value may only be used with permission from OUP.report*:fn-groupchild::*:title[ . = 'Endnotes']
nlm-core-rule-205errorJATS and BITS QA rules applying to specified content elements and attributesParent of a fn-group element must be a back, ack, or toc element.assert*:fn-groupparent::*:back or parent::*:ack or parent::*:toc
nlm-core-rule-144error
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-153error
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-169fatal-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-256errorJATS 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-294errorJATS and BITS QA rules applying to specified content elements and attributesCheck that @xlink:href starts "https://" for links to Creative Commonsreport*: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-319errorJATS and BITS QA rules applying to specified content elements and attributesFor 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-49errorNLM-1-0048JATS and BITS QA rules applying to specified content elements and attributesChecks 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-271errorJATS and BITS QA rules applying to specified content elements and attributesA list element may not be a child of a p element.report*:listparent::*:p and not(ancestor::*:statement) and not(ancestor::*:abstract) and not(ancestor::*:fn) and not(ancestor::*:caption)
nlm-core-rule-101errorNLM-1-0104JATS 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*:medianot(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-102errorNLM-1-0105JATS 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-195errorJATS and BITS QA rules applying to specified content elements and attributesA video object-id/@referenceid must not contain /.report*:mediacontains(*:object-id[@pub-id-type='referenceid'],'/')
nlm-core-rule-257errorJATS 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-112errorJATS and BITS QA rules applying to specified content elements and attributesmixed-citation element must have a non-empty value of @publication-typeassert*:mixed-citation@publication-type and @publication-type != ''
nlm-core-rule-178errorJATS and BITS QA rules applying to specified content elements and attributesChecks for empty elements in mixed-citation.report*:mixed-citationchild::*[count(child::*) = 0 and normalize-space(string(.)) = '' and not(self::inline-graphic)]
nlm-core-rule-272errorJATS and BITS QA rules applying to specified content elements and attributesA 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-273errorJATS and BITS QA rules applying to specified content elements and attributesA 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-275errorJATS and BITS QA rules applying to specified content elements and attributesChecks 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-304errorJATS and BITS QA rules applying to specified content elements and attributesThe name element may not be used in mixed-citation (we require string-name).report*:mixed-citationchild::*:name or child::*:person-group/*:name
nlm-core-rule-342errorJATS and BITS QA rules applying to specified content elements and attributesChecks for mixed-citation elements containing more than one edition element (which causes a Crossref deposit failure).report*:mixed-citationexists(child::edition[2])
nlm-core-rule-315errorJATS and BITS QA rules applying to specified content elements and attributesFlags if a semantic MathML element is usedreport
mml:csymbol
mml:set
self::*
nlm-core-rule-214errorJATS and BITS QA rules applying to specified content elements and attributesChecks that MathML has at least one non-empty text node.assertmml:mathdescendant::text()[normalize-space() ne '']
nlm-core-rule-233errorJATS and BITS QA rules applying to specified content elements and attributesChecks that parent of mml:math and tex-math is disp-formula or inline-formula.assert
mml:math
*:tex-math
parent::*:disp-formula or parent::*:inline-formula
nlm-core-rule-310errorJATS and BITS QA rules applying to specified content elements and attributes<m:math> must not contain deprecated @mode attribute.reportmml:math@mode
nlm-core-rule-311errorJATS and BITS QA rules applying to specified content elements and attributes<m:math> must not contain deprecated @other attribute.reportmml:math@other
nlm-core-rule-312errorJATS and BITS QA rules applying to specified content elements and attributes<m:math> must not contain deprecated @macros attribute.reportmml:math@macros
nlm-core-rule-8errorNLM-1-0008JATS and BITS QA rules applying to specified content elements and attributesCertain elements (e.g. mml:mtext) shouldn't repeat as consecutive siblings. (Exception: when parent is mml:sup, mml:sub, or mml:subsup)report
mml:mn
mml:mtext
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-313errorJATS and BITS QA rules applying to specified content elements and attributesMathML mml:mtable element must contain mml:mtr.assertmml:mtablechild::mml:mtr
nlm-core-rule-314errorJATS and BITS QA rules applying to specified content elements and attributesMathML mml:mtr element must contain mml:mtd.assertmml:mtrchild::mml:mtd
nlm-core-rule-212errorJATS and BITS QA rules applying to specified content elements and attributesmml:none is only allowed as a child of mml:mmultiscripts.assertmml:noneparent::mml:mmultiscripts
nlm-core-rule-211errorJATS and BITS QA rules applying to specified content elements and attributesmml:semantics is only allowed as a child of mml:math.assertmml:semanticsparent::mml:math
nlm-core-rule-343errorJATS and BITS QA rules applying to specified content elements and attributesChecks 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-216errorJATS and BITS QA rules applying to specified content elements and attributesChecks 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-3errorNLM-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 formattingassert
*: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-193warningJATS and BITS QA rules applying to specified content elements and attributesGenBank mentioned with a call out.report*:pparent::*:sec and (contains(lower-case(.), 'genbank') or contains(lower-case(.), 'gen bank')) and not(child::*:ext-link[@ext-link-type='gen'])
nlm-core-rule-249errorJATS and BITS QA rules applying to specified content elements and attributesPrivate use unicode range must no be used in the XML.report*:pmatches(., '\p{IsPrivate_Use}')
nlm-core-rule-289errorJATS and BITS QA rules applying to specified content elements and attributesExternal links starting www., http:// or https:// must be captured with an <ext-link> element.report*:pdescendant::text()[contains(lower-case(.), 'www.') or contains(lower-case(.), 'http://') or contains(lower-case(.), 'https://')][not(ancestor::*:ext-link)]
nlm-core-rule-255errorJATS and BITS QA rules applying to specified content elements and attributesOne person-group element per role must be used.report*:person-group./preceding-sibling::*:person-group[@person-group-type = ./@person-group-type]
nlm-core-rule-303errorJATS 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-97errorNLM-1-0101JATS and BITS QA rules applying to specified content elements and attributes<private-char> must be used only with express permission from OUP.report*:private-charself::*:private-char
nlm-core-rule-269errorJATS and BITS QA rules applying to specified content elements and attributesOnly one <mixed-citation> is permitted in <ref>report*:ref*:mixed-citation[2]
nlm-core-rule-100errorNLM-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-341errorJATS and BITS QA rules applying to specified content elements and attributesChecks 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*:refchild::*: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-10errorNLM-1-0010JATS and BITS QA rules applying to specified content elements and attributesSmall Caps should consist of normal sentence casereport*:scmatches(., '^[\s\p{Lu}]*$') or ( matches(., '^[\s\p{Ll}]*$') and matches(preceding-sibling::text()[1], '\p{Lu}$') )
nlm-core-rule-6errorNLM-1-0006JATS and BITS QA rules applying to specified content elements and attributesCertain elements (e.g. sec) must have children other than 'title'assert*:secchild::*[not(self::*:title)]
nlm-core-rule-175errorJATS and BITS QA rules applying to specified content elements and attributesstring-name must not contain more than 1 surname or more than 1 given-names.report*:string-namechild::*:surname[2] or child::*:given-names[2]
nlm-core-rule-251errorJATS and BITS QA rules applying to specified content elements and attributesstring-name containing <given-names> with no <surname>report*:string-name*:given-names and not(*:surname)
nlm-core-rule-268errorJATS and BITS QA rules applying to specified content elements and attributes<suffix> element must not contain more than 10 characters (crossRef limitation).report*:suffixstring-length(.) > 10
nlm-core-rule-322errorJATS and BITS QA rules applying to specified content elements and attributesChecks 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-105errorJATS and BITS QA rules applying to specified content elements and attributesChecks 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-259errorJATS and BITS QA rules applying to specified content elements and attributes<tex-math> may not contain whitespace outside the $ delimiter.assert*:tex-mathstring-length(.) = string-length(normalize-space(.))
nlm-core-rule-264errorJATS and BITS QA rules applying to specified content elements and attributesFor inline math use a inline-formula element with a $ delimiter. For block math use a disp-formula element with a $$ delimiter.assert*:tex-mathstarts-with(normalize-space(.),'$')
nlm-core-rule-301warningJATS and BITS QA rules applying to specified content elements and attributesChecks 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-mathstring()[matches(.,'.+textrm\{[\S]+_[\S]+\}.+')] or string()[matches(.,'.+textrm\{_[\S]+\}.+')]
nlm-core-rule-160error
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-288errorJATS and BITS QA rules applying to specified content elements and attributesFor 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-23errorNLM-1-0023JATS and BITS QA rules applying to specified content elements and attributesxref element must have @rid and @ref-type.assert*:xrefexists(@ref-type) and exists(@rid)
nlm-core-rule-25errorNLM-1-0025JATS and BITS QA rules applying to specified content elements and attributesChecks 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-131errorJATS and BITS QA rules applying to specified content elements and attributesFlags if xref in a contributor has invalid @ref-type.report*:xrefparent::*:contrib and not( @ref-type = 'aff' or @ref-type = 'corresp' or @ref-type = 'fn' )
nlm-core-rule-221warningJATS and BITS QA rules applying to specified content elements and attributesWarns if xref element ends with a comma.report*:xref ends-with(normalize-space(string()),',')
nlm-core-rule-109errorJATS QA rules applying to specified content elements and attributesCitation 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-184errorJATS QA rules applying to specified content elements and attributesChecks that @xlink:href value is not uppercase.report@xlink:href (parent::*:graphic or parent::*:inline-graphic) and matches(.,'\p{Lu}')
nlm-core-rule-14errorNLM-1-0014JATS QA rules applying to specified content elements and attributesChecks for presence of @article-type attributeassert*:article@article-type and @article-type != ''
nlm-core-rule-15errorNLM-1-0014JATS QA rules applying to specified content elements and attributesChecks for correct @article-type attribute when the article-meta contains a productreport*:article( child::*:front/*:article-meta/*:product and not( @article-type='book-review' or @article-type='product-review' ) )
nlm-core-rule-108warningJATS QA rules applying to specified content elements and attributesWarning if article contains no email addresses.assert*:articledescendant::*:email
nlm-core-rule-115errorNLM-1-0016JATS QA rules applying to specified content elements and attributesChecks 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-145warningJATS QA rules applying to specified content elements and attributesWarning 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-147errorJATS QA rules applying to specified content elements and attributesPAP 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-191warningJATS QA rules applying to specified content elements and attributes@article-type="other" needs to be questioned.report*:article@article-type='other'
nlm-core-rule-209errorJATS QA rules applying to specified content elements and attributesA 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-247errorJATS QA rules applying to specified content elements and attributesCertain kinds of article must not contain a body elementreport*: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-290errorJATS QA rules applying to specified content elements and attributesArticle must have a page count. This does not apply to articles which have no body element.report*:articledescendant::*:body and not(descendant::*:counts/*:page-count)
nlm-core-rule-199errorJATS QA rules applying to specified content elements and attributesOxford taxonomy subject not present.assert*:article-categoriescount(child::*:subj-group[@subj-group-type='category-taxonomy-collection']/*:subject[starts-with(text(),'AcademicSubjects/')]) > 0
nlm-core-rule-293errorJATS 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-196errorJATS QA rules applying to specified content elements and attributes3D model fig must have an object-id with @pub-id-type of doireport*:fig@fig-type='model' and not(child::*:object-id[@pub-id-type='doi'])
nlm-core-rule-197errorJATS QA rules applying to specified content elements and attributes3D 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-51errorNLM-1-0050JATS QA rules applying to specified content elements and attributesElement '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-305errorJATS QA rules applying to specified content elements and attributesFor 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*:mediastarts-with(@xlink:href,'https://players.brightcove.net/1611106596001/default_default/index.html?videoId=')
nlm-core-rule-204errorJATS QA rules applying to specified content elements and attributesParent of a notes element must be a back element.assert*:notesparent::*:back
nlm-core-rule-121error
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 usedreport
*:element-citation
*:response
self::*
nlm-core-rule-119error
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-186warningJATS QA rules applying to specified content elements and attributesAppendices must be captured in <app>.report
*:sec[parent::*:abstract]
*:sec
parent::*:back and *:title[contains(lower-case(.), 'appendi')]
nlm-core-rule-238errorJATS QA rules applying to specified content elements and attributesChecks 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-279errorJATS QA rules applying to specified content elements and attributesReport 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-280errorJATS QA rules applying to specified content elements and attributesReport 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-132errorJATS QA rules applying to specified content elements and attributesFlags if xref in a contributor has a child node.report*:xrefparent::*:contrib and child::node()
nlm-core-rule-236warningJATS QA rules applying to specified content elements and attributesContent of <xref> but be inside <sup>report*:xref(parent::*:article-title and @ref-type[. = 'fn']) and not(child::*:sup)
nlm-core-rule-230errorJournals JATS complexChecking article issue-title against issue_metareport*: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-20errorNLM-1-0019
Journals JATS complex
JATS QA rules applying to article metadata only (not issue meta)
Checks valid types of pub-dateassert
*: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-201warningJournals JATS complexChecking article pub-date against issue_metareport*: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-337errorJournals JATS complexThe 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-33errorNLM-1-0033JATS QA rules applying to metadataChecks 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-170warningJATS QA rules applying to metadataWarn 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-190errorJATS QA rules applying to metadataTeaser must not have a title.report*:abstract@abstract-type='teaser' and *:title
nlm-core-rule-200errorJATS QA rules applying to metadataAbstract 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-262errorJATS QA rules applying to metadataLay Summary must have title 'Lay Summary'report*:abstract@specific-use='layperson' and not(*:title/text() = 'Lay Summary')
nlm-core-rule-263errorJATS QA rules applying to metadataLay 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-320errorJATS QA rules applying to metadataChecks 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-130error
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
*:aff
*:corresp
*:fn
@id = //*:xref/@rid or @id = //*:related-object/@object-id or self::*:fn[parent::*:table-wrap-foot] or self::*:aff[parent::*:contrib]
nlm-core-rule-160error
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-189errorJATS QA rules applying to metadataaff must not be repeated.report*:aff. = preceding-sibling::*:aff
nlm-core-rule-100errorNLM-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-215errorJATS QA rules applying to metadataChecks 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-260errorJATS QA rules applying to metadatapublisher-id must be longer than 4 characters.report*:article-id@pub-id-type = 'publisher-id' and string-length(.) < 5
nlm-core-rule-203error
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
*:article-id
@xlink:href
. = normalize-space(.)
nlm-core-rule-292errorJATS 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-345errorJATS QA rules applying to metadataChecks that article DOI conforms to the standard format for OUP journal article DOIsreport*:article-idparent::*:article-meta and @pub-id-type='doi' and not(matches(text(), '^10.1093/[a-z]+/[a-z]+[\d]+[.]?[\d]*$'))
nlm-core-rule-18errorNLM-1-0017JATS QA rules applying to metadataChecks article-meta has article-categories child.assert*:article-metachild::*:article-categories
nlm-core-rule-19errorNLM-1-0018JATS QA rules applying to metadataChecks for fpage or elocation-id child of article-metaassert*:article-metachild::*:fpage or child::*:elocation-id
nlm-core-rule-72errorNLM-1-0076JATS QA rules applying to metadataArticle must have an article-id element with @pub-id-type="doi"assert*:article-metachild::*:article-id[@pub-id-type='doi']
nlm-core-rule-85errorNLM-1-0090JATS QA rules applying to metadataArticle (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-86errorNLM-1-0091JATS QA rules applying to metadataArticle (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-87errorNLM-1-0092JATS QA rules applying to metadataArticle must have an electronic publication date.assert*:article-metachild::*:pub-date[@pub-type='epub']
nlm-core-rule-148warningJATS QA rules applying to metadataArticle 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-149errorJATS QA rules applying to metadataArticle 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-150errorJATS QA rules applying to metadataArticle must have an article-id element with @pub-id-type="publisher-id"assert*:article-metachild::*:article-id[@pub-id-type='publisher-id']
nlm-core-rule-163warningJATS QA rules applying to metadataArticles 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-165errorJATS QA rules applying to metadataWarn 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-185errorJATS QA rules applying to metadataelocation-id should be the OUP article ID (the same as the end of the DOI)report*:article-metanot(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-188warningJATS QA rules applying to metadataPDF filename must match publisher-id.report*:article-metasubstring-before(*:self-uri/@xlink:href,'.pdf')[1] != *:article-id[@pub-id-type='publisher-id']
nlm-core-rule-231errorJATS QA rules applying to metadataChecks that article-meta contains permissions.assert*:article-metachild::*:permissions
nlm-core-rule-239warningJATS QA rules applying to metadataChecks for multiple featured content.report*:article-metachild::*:supplementary-material[starts-with(@content-type, 'featured')][2]
nlm-core-rule-287errorJATS QA rules applying to metadataPage count must be an integer. Letters and decimal points are not permitted.report*:article-metachild::*:counts/*:page-count[matches(@count,'\D')]
nlm-core-rule-3errorNLM-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 formattingassert
*: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-166warningJATS QA rules applying to metadataWarn if article title does not end in a word character or expected punctuation: ' " ” ’ . ! ? ) ].report*:article-titleancestor::*:article-meta and not( child::node() [not(descendant-or-self::*:xref)] [last()] [matches(string(),'[\w\?\)\.\]!''"”’]$')])
nlm-core-rule-176errorJATS QA rules applying to metadatacollab must not contain certain strings.report*:collab contains(lower-case(.), 'on behalf of') or contains(lower-case(.), 'document reviewers')
nlm-core-rule-207errorJATS QA rules applying to metadataThe content of the collab element must be a text node optionally followed by contrib-group elements.assert*:collabchild::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-77errorNLM-1-0082JATS QA rules applying to metadataChecks that email is present for corresponding authorreport*:contrib( @corresp = 'yes' and not(descendant::*:email) )
nlm-core-rule-140errorJATS QA rules applying to metadataChecks that no more than one email is present per contribreport*:contribcount(child::*:email) > 1
nlm-core-rule-182errorJATS QA rules applying to metadataChecks 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-244errorJATS QA rules applying to metadataContributors should not have more than one xref with @ref-type='corresp'.report*:contrib*:xref[@ref-type ='corresp'][2]
nlm-core-rule-282errorJATS QA rules applying to metadataThe @corresp attribute may only be used on individual authors, not on collaboration groups.report*:contrib@corresp and child::*:collab
nlm-core-rule-286errorJATS QA rules applying to metadataA contrib element may contain only one name child element.report*:contrib count(child::*:name) > 1
nlm-core-rule-327errorJATS QA rules applying to metadatacontrib in sub-article/front-stub must have @contrib-type="author".report*:contribancestor::*:sub-article and not(@contrib-type eq 'author')
nlm-core-rule-328errorJATS QA rules applying to metadatacontrib in sub-article/front-stub must have role/@specific-use with a valid value. This rule checks against the PoolParty controlled vocabulary 'PeerReviewContributorRoleSpecificUse'.report*:contribancestor::*: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-336errorJATS QA rules applying to metadataA 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-138errorJATS QA rules applying to metadataChecks 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-237errorJATS QA rules applying to metadataChecks 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-17errorNLM-1-0016JATS QA rules applying to metadataChecks date elements have the correct value of @date-type. This rule checks against the PoolParty controlled vocabulary 'PubStatus'.assert*:dateparent::*: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-107errorJATS QA rules applying to metadataChecks that email element has content that looks like a valid email address and only contains one address.assert*:emailmatches( ., '^[\w\-\+\.''_]*@[\w\-\._]+\.[\w]+$' )
nlm-core-rule-331errorJATS QA rules applying to metadataevent/@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-158errorJATS QA rules applying to metadataEach 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-168warningJATS QA rules applying to metadataWarn 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-namesparent::*:name[parent::*:contrib] and matches(string(),'\p{Lu}[\.\p{Lu}]')
nlm-core-rule-277warningJATS QA rules applying to metadataCheck 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-44errorNLM-1-0044JATS QA rules applying to metadataChecks ISSN formatreport*:issnancestor::*:journal-meta and not( oupfn:is-valid-issn(.) )
nlm-core-rule-45errorNLM-1-0045JATS QA rules applying to metadataChecks presence of @pub-type on issn elementassert*:issn@pub-type and @pub-type != ''
nlm-core-rule-46errorNLM-1-0045JATS QA rules applying to metadataChecks 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-78errorNLM-1-0083JATS QA rules applying to metadataChecks that there are no spaces in issue or volume elementsreport
*:issue
*:volume
parent::*:article-meta and matches(., '\s')
nlm-core-rule-91errorNLM-1-0095JATS QA rules applying to metadataChecks format of issue value.report*:issueparent::*: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-128errorJATS QA rules applying to metadataChecks that @content-type="empty" is used for empty volume and issue elements.report
*:issue
*:volume
( . = '' and not( @content-type = 'empty' ) )
nlm-core-rule-234errorJATS QA rules applying to metadataChecks for deprecated attribute @content-type="supplement".report*:issue @content-type = 'supplement'
nlm-core-rule-174errorJATS QA rules applying to metadataChecks for a br in issue-titlereport*:issue-titleparent::*:article-meta and child::*:br
nlm-core-rule-278errorJATS QA rules applying to metadataChecking article issue-title against issue_metareport*: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-47errorNLM-1-0046JATS QA rules applying to metadataChecks 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-71errorNLM-1-0075JATS QA rules applying to metadataArticle must have an electronic ISSN.assert*:journal-metachild::*:issn[@pub-type='epub']
nlm-core-rule-83errorNLM-1-0088JATS QA rules applying to metadataChecks for existence of OUP product code in journal metadataassert*:journal-metachild::*:journal-id[@journal-id-type='publisher-id']
nlm-core-rule-106errorJATS 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-metachild::*: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-48errorNLM-1-0047JATS QA rules applying to metadataChecks that journal-meta has journal-titleassert*:journal-title-groupchild::*:journal-title
nlm-core-rule-338errorJATS QA rules applying to metadataElement <name-alternatives> should only be used where the contributor has two names.assert*:name-alternativesexists(child::*:name[2]) or (exists(child::*:name) and exists(child::*:string-name))
nlm-core-rule-339errorJATS 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-181errorJATS QA rules applying to metadataChecks 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-232errorJATS QA rules applying to metadataChecks 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-114content-warningJATS QA rules applying to metadataOnline 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-156errorJATS QA rules applying to metadataWarn if ppub date found in Continuous Publication or Online Only journal.report*:pub-dateif (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-220errorJATS QA rules applying to metadataChecks 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-276errorJATS QA rules applying to metadataCheck 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-281errorJATS QA rules applying to metadataElement 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-340errorJATS QA rules applying to metadataElement 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-16errorNLM-1-0015JATS QA rules applying to metadataCheck @related-article-type is allowed value and corresponds correctly to @article-typeassert*: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-32errorNLM-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 @idassert
*: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-52errorNLM-1-0051JATS QA rules applying to metadataChecks for required attributes of <related-article>.assert*:related-article( @ext-link-type='doi' and @related-article-type and @xlink:href )
nlm-core-rule-177errorJATS QA rules applying to metadataChecks for related-article in article-meta if there is one in body.report*:related-articleancestor::*:body and not(//*:related-article[parent::*:article-meta])
nlm-core-rule-229errorJATS QA rules applying to metadataWarns 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-296errorJATS QA rules applying to metadataCRediT 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-297errorJATS QA rules applying to metadataCredit 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-298errorJATS QA rules applying to metadata@degree-contribution values must match the taxonomy.report*:roleexists(@degree-contribution) and not(document('helpers/scout/CRediT_Degrees.rdf')/rdf:RDF/rdf:Description[skos:prefLabel=@degree-contribution])
nlm-core-rule-299errorJATS QA rules applying to metadataCredit role @vocab-term must match text of role.report*:role@vocab='credit' and (@vocab-term != .)
nlm-core-rule-93errorNLM-1-0097JATS QA rules applying to metadataseason element is only allowed as part of a cover date.assert*:seasonparent::*:pub-date[@pub-type='cover']
nlm-core-rule-325errorJATS QA rules applying to metadatasub-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-326errorJATS QA rules applying to metadatasub-article/front-stub must contain a DOI.assert*:sub-articleexists(child::*:front-stub/*:article-id[@pub-id-type eq 'doi'])
nlm-core-rule-329errorJATS QA rules applying to metadatasub-article/front-stub must contain a title.assert*:sub-articleexists(child::*:front-stub/*:title-group/*:article-title)
nlm-core-rule-330errorJATS QA rules applying to metadatasub-article/front-stub must contain an event date.assert*:sub-articleexists(child::*:front-stub/*:pub-history/*:event/*:date)
nlm-core-rule-332errorJATS QA rules applying to metadatasub-article/front-stub must contain a revision round.assert*:sub-articleexists(child::*:front-stub/*:custom-meta-group/*:custom-meta/*:meta-name[text() eq 'peer-review-revision-round'])
nlm-core-rule-333errorJATS QA rules applying to metadatasub-article/front-stub must contain a valid revision round value.assert*:sub-articleexists(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-334errorJATS QA rules applying to metadatasub-article/front-stub must contain a self-uri.assert*:sub-articleexists(child::*:front-stub/*:self-uri)
nlm-core-rule-116error
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-118error
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-126errorJATS QA rules applying to metadataChecks 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-171errorJATS 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-192warningJATS 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-56errorNLM-1-0057JATS QA rules applying to metadatasubj-group[@subj-group-type="category-toc-heading"] may have at most one child subjectreport*:subj-group@subj-group-type='category-toc-heading' and count(child::*:subject) > 1
nlm-core-rule-84errorNLM-1-0089JATS QA rules applying to metadatachecks for correct maximum nesting of TOC headingsreport*:subj-group( @subj-group-type='category-toc-heading' and count(ancestor::*:subj-group) > 2 )
nlm-core-rule-104errorJATS 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-125errorJATS QA rules applying to metadataChecks 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-154errorJATS 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-144error
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-153error
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-169fatal-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-248errorJATS QA rules applying to metadataissue-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-123errorJATS QA rules applying to metadataChecks for correct structure of supplementary-materialassert*: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-241errorJATS QA rules applying to metadataA 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-252errorJATS QA rules applying to metadataThe 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-218errorJATS QA rules applying to metadataChecks 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-129errorJATS QA rules applying to metadataChecks that @xml:lang attribute is used for translated abstracts.assert*:trans-abstract@xml:lang
nlm-core-rule-151errorJATS QA rules applying to metadataArticle may have at most one subtitle.assert*:title-groupcount(child::*:subtitle) <= 1
nlm-core-rule-20errorNLM-1-0019
Journals JATS complex
JATS QA rules applying to article metadata only (not issue meta)
Checks valid types of pub-dateassert
*: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-324errorJATS 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-11errorNLM-1-0011JATS and BITS QA rules applying to metadataAbstract 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-12errorNLM-1-0012JATS and BITS QA rules applying to metadataChecks 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-119error
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-167warningJATS and BITS QA rules applying to metadataWarn 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-243errorJATS and BITS QA rules applying to metadataThere 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-344errorJATS and BITS QA rules applying to metadataChecks if abstract contains xref or related-object element.report*:abstractdescendant::*:xref or descendant::*:related-object
nlm-core-rule-133errorJATS and BITS QA rules applying to metadataFlags if aff or corresp in article metadata has a label child.report
*:aff
*:corresp
self::node()[ (self::*:aff and parent::*:article-meta) or parent::*:author-notes ] [child::*:label]
nlm-core-rule-162errorJATS and BITS QA rules applying to metadataaff 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-206errorJATS and BITS QA rules applying to metadataThe aff element must not contain an xref with @ref-type="aff".report*:affdescendant::*:xref[@ref-type = 'aff']
nlm-core-rule-253warningJATS and BITS QA rules applying to metadataAn aff element should contain an institution element.assert*:affexists(child::*:institution)
nlm-core-rule-172errorJATS and BITS QA rules applying to metadataChecks element has @idreport*:author-notes@id
nlm-core-rule-321error
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
*:author-notes
*:fig
.[child::*:p]
nlm-core-rule-146errorJATS and BITS QA rules applying to metadataChecks that award-group element has @award-type="grant".assert*:award-group @award-type = 'grant'
nlm-core-rule-26errorNLM-1-0026JATS and BITS QA rules applying to metadatacontrib must not have both have a collab child and a name child.report*:contribchild::*:name and child::*:collab
nlm-core-rule-27errorNLM-1-0026JATS and BITS QA rules applying to metadatacontrib should have either a single collab child or a single name or name-alternatives (with optional translations of that name).assert*:contribcount(child::*:collab) = 1 or count(child::*:name-alternatives) = 1 or count(child::*:name[not(@xml:lang)]) = 1
nlm-core-rule-120errorJATS and BITS QA rules applying to metadataChecks 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-179errorJATS and BITS QA rules applying to metadataChecks 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-183errorJATS and BITS QA rules applying to metadataChecks role elements have the correct value.report*:contrib@contrib-type = 'author' and child::*:role[contains(., 'ditor')]
nlm-core-rule-265errorJATS and BITS QA rules applying to metadataA contributor's address must not be captured using the address element.report*:contribchild::*:address
nlm-core-rule-110errorJATS and BITS QA rules applying to metadataElement 'contrib-group' occurring inside 'collab' may not contain descendant 'collab' elementsreport*:contrib-groupancestor::*:collab and descendant::*:collab
nlm-core-rule-300errorJATS and BITS QA rules applying to metadataA 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-groupnot(.[following-sibling::aff]) and (every $c in child::* satisfies $c[self::*:contrib or self::*:on-behalf-of])
nlm-core-rule-111errorJATS and BITS QA rules applying to metadataORCID 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-240errorJATS and BITS QA rules applying to metadataORCIDs 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-208errorJATS and BITS QA rules applying to metadataThe 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-28errorNLM-1-0027JATS and BITS QA rules applying to metadataChecks year and copyright-year for valid year range (between 1700 and 2100).report
*:copyright-year
*:year
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-32errorNLM-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 @idassert
*: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-130error
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
*:aff
*:corresp
*:fn
@id = //*:xref/@rid or @id = //*:related-object/@object-id or self::*:fn[parent::*:table-wrap-foot] or self::*:aff[parent::*:contrib]
nlm-core-rule-254errorJATS and BITS QA rules applying to metadataThe value of the @country attribute must be a valid ISO 3166 codeassert*: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-29errorNLM-1-0028JATS and BITS QA rules applying to metadataDates with days specified must also specify a month.report
*:date
*:pub-date
child::*:day and not(child::*:month)
nlm-core-rule-30errorNLM-1-0029JATS and BITS QA rules applying to metadataChecks that days in dates are integers between 1 and 31 inclusivereport
*:date
*:pub-date
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-31errorNLM-1-0030JATS and BITS QA rules applying to metadataMonths in dates must be captured as an integer between 1 and 12 (inclusive).report
*:date
*:pub-date
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-318errorJATS and BITS QA rules applying to metadataThe degrees element must be placed immediately after the contributor name.assert*:degrees.[preceding-sibling::*[1][self::*:name]]
nlm-core-rule-245errorJATS and BITS QA rules applying to metadataEdition element cannot contain more than 15 characters.report*:editionancestor::*:mixed-citation and (string-length(.) > 15 or string-length(.) = 0)
nlm-core-rule-42errorNLM-1-0042JATS and BITS QA rules applying to metadataChecks that there is an lpage element if there is an fpage elementreport*:fpage parent::*[self::*:article-meta or self::*:book-part-meta] and not(following-sibling::*:lpage)
nlm-core-rule-79errorNLM-1-0084JATS and BITS QA rules applying to metadataChecks 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-242errorJATS and BITS QA rules applying to metadataChecks 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-246errorJATS and BITS QA rules applying to metadatavolume, 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-142errorJATS and BITS QA rules applying to metadataChecks 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-143warningJATS and BITS QA rules applying to metadataChecks that funder identifier is present alongside funder name and matches value in FundRef registry.report*:funding-sourcenormalize-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-159errorJATS and BITS QA rules applying to metadataA 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-274errorJATS and BITS QA rules applying to metadataA funding-source element must contain a institution-wrap element.assert*:funding-sourcechild::*:institution-wrap
nlm-core-rule-335errorJATS and BITS QA rules applying to metadataFor 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-160error
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-210warningJATS and BITS QA rules applying to metadataA 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-94errorNLM-1-0098JATS and BITS QA rules applying to metadatalicense 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-136errorJATS and BITS QA rules applying to metadataChecks 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-164errorJATS and BITS QA rules applying to metadataIn 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-88errorNLM-1-0094aJATS and BITS QA rules applying to metadataPublication 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-89errorNLM-1-0094bJATS and BITS QA rules applying to metadataPublication 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-90errorNLM-1-0094cJATS and BITS QA rules applying to metadataPublication 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-157errorNLM-1-0094aJATS and BITS QA rules applying to metadataElement 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-20report*: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-219errorJATS and BITS QA rules applying to metadataChecks 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-100errorNLM-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-217errorJATS and BITS QA rules applying to metadataChecks 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-222errorJATS and BITS QA rules applying to metadataChecks 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-223errorJATS and BITS QA rules applying to metadataChecks 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-224errorJATS and BITS QA rules applying to metadataChecks 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-225errorJATS and BITS QA rules applying to metadataChecks 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-226errorJATS and BITS QA rules applying to metadataChecks 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-227errorJATS and BITS QA rules applying to metadataChecks 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-228errorJATS and BITS QA rules applying to metadataChecks 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-144error
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-153error
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-169fatal-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-55errorNLM-1-0056JATS and BITS QA rules applying to metadatasubject 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-3errorNLM-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 formattingassert
*: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-3berrorJATS and BITS QA rules applying to metadataCertain elements may not contain only typographic formattingreport*:subtitle not(doc-available('helpers/scout/Publishers.rdf')) and not( child::text()[normalize-space(.) != ''] )
nlm-core-rule-258errorJATS 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-266error
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-270error
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-1informationJournals issue metadataSanity Check - make sure Schematron rules are running.report*:issue-meta self::*:issue-meta
jrn-issue-meta-core-rule-2errorJournals issue metadataAn 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-4errorJournals issue metadataIf an issue meta file has issue @content-type="supplement", then it must have <issue-type>supplemental</issue-type>. report*:issue-metadescendant::*:issue[contains(., 'uppl')] and not(*:issue-type= 'supplemental')
jrn-issue-meta-core-rule-5warningJournals issue metadataIssue meta files may have either a ppub pub-date or collection pub-date, but never both.report*:issue-metachild::*:pub-date[@pub-type='ppub'] and child::*:pub-date[@pub-type='collection']
jrn-issue-meta-core-rule-6errorJournals issue metadataIssue meta files must not have an epub pub-date.report*:issue-metachild::*:pub-date[@pub-type='epub']
jrn-issue-meta-core-rule-7errorJournals issue metadataIssue meta files must have a valid journal code.assert*:issue-metachild::*: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-8errorJournals issue metadataIssue meta file containing a full issue PDF self-uri link is only allowed when issue is supplementalreport*:issue-metadescendant::*:self-uri and not(*:issue-type= 'supplemental')
jrn-issue-meta-core-rule-9errorJournals issue metadataIssue meta files must use v1.42 of SCJATS.assert*:issue-metanamespace-uri() = 'http://specifications.silverchair.com/xsd/1/42/SCJATS-journalissue-mathml3.xsd'