# SPA_DF4_8_4F_RAIL_SFM_2022.xml

Report URI | Link
Status | Passed
Started | 24/09/2024 12:17:56 GMT
Duration | 3 s
Report version | 2.1.0-b181101
Log URI | Link

| Total Count | Skipped | Failed | Warnings | Manual
--- | --- | --- | --- | --- | ---
Test suites | 4 | 0 | 0 | 0 | 0
Test cases | 11 | 0 | 0 | 0 | 0
Assertions | 41 | 0 | 0 | 0 | 0

Level of detail All detailsLess informationSimplified
Show AllOnly failedOnly manual

### Parameters

tests_to_execute | .*
files_to_test | .*

### Test object: SPA_DF4_8_4F_RAIL_SFM_2022.xml

Files: 1

Size: 14 KB

Associated test object types:

- Metadata records (A set of XML documents. Each document contains one or more gmd:MD_Metadata elements.)

### Metadata record statistics

Type | Total Count
--- | ---
all | 1
dataset | 1

### Log path: Common Requirements for ISO/TC 19139:2007 based INSPIRE metadata records.

    Testing 1 records
    Executing Test Suite: /etf/projects/inspire-ets-repository/ets-repository-2024.2/metadata/2.0/common/ets-md-common-bsxets.xml
    Statistics table: 12 ms
    Test Suite 'Common Requirements for ISO/TC 19139:2007 based INSPIRE metadata records.' started
    Test Case 'General requirements' started
    Test Assertion 'md common req C.1: XML Schema': PASSED - 218 ms
    Test Assertion 'md common req C.2: Root Element': PASSED - 0 ms
    Test Assertion 'md common req C.5: Language Code': PASSED - 1 ms
    Test Assertion 'md common req C.6: Metadata Point of Contact': PASSED - 0 ms
    Test Assertion 'md common req C.7: Metadata Date': PASSED - 9 ms
    Test Case 'General requirements' finished: PASSED
    Test Case 'Identification' started
    Test Assertion 'md common req C.8: Resource Title': PASSED - 0 ms
    Test Assertion 'md common req C.9: Resource Abstract': PASSED - 0 ms
    Email Char: 1
    Email Anch: 0
    Test Assertion 'md common req C.10: Responsible Organization': PASSED - 20 ms
    Test Assertion 'md common req C.11: Temporal Reference': PASSED - 29 ms
    Test Assertion 'md common req C.12: Max One Date of Creation': PASSED - 1 ms
    Test Assertion 'md common req C.13: Not More than one Date of Last Revision': PASSED - 0 ms
    Test Assertion 'md common req C.14: Temporal Extent': PASSED - 44 ms
    Test Assertion 'md common req C.15: Keyword Originating CV': PASSED - 0 ms
    Test Assertion 'md common req C.16: Group Keywords by CV': PASSED - 0 ms
    Test Assertion 'md common req C.17: Limitations on Public Access': PASSED - 0 ms
    Test Assertion 'md common req C.18: Conditions for Access and Use': PASSED - 0 ms
    Test Assertion 'md common req C.19: Geographical Bounding Box': PASSED - 0 ms
    Test Case 'Identification' finished: PASSED
    Test Case 'Data quality' started
    Test Assertion 'md common req C.20: Dataset Conformity': PASSED - 0 ms
    Test Assertion 'md common req C.21: Dataset Conformity Specifications': PASSED - 15 ms
    Test Assertion 'md common req C.22: Conformity Degree': PASSED - 0 ms
    Test Case 'Data quality' finished: PASSED
    Test Suite 'Common Requirements for ISO/TC 19139:2007 based INSPIRE metadata records.' finished: PASSED

### Log path: Conformance Class 1: INSPIRE data sets and data set series baseline metadata.

    Testing 1 records
    Executing Test Suite: /etf/projects/inspire-ets-repository/ets-repository-2024.2/metadata/2.0/datasets-and-series/ets-md-datasets-and-series-bsxets.xml
    Statistics table: 11 ms
    Test Suite 'Conformance Class 1: INSPIRE data sets and data set series baseline metadata.' started
    Test Case 'General Metadata' started
    Test Assertion 'md datasets-and-series 1.1: Resource Type': PASSED - 0 ms
    Test Case 'General Metadata' finished: PASSED
    Test Case 'Identification' started
    Test Assertion 'md datasets-and-series 1.2: Only One Data Identification': PASSED - 0 ms
    Test Assertion 'md datasets-and-series 1.3: Dataset UID': PASSED - 0 ms
    Checking URL: 'http://inspire.ec.europa.eu/theme/theme.bg.atom'
    Checking URL: 'http://inspire.ec.europa.eu/theme/theme.cs.atom'
    Checking URL: 'http://inspire.ec.europa.eu/theme/theme.da.atom'
    Checking URL: 'http://inspire.ec.europa.eu/theme/theme.de.atom'
    Checking URL: 'http://inspire.ec.europa.eu/theme/theme.et.atom'
    Checking URL: 'http://inspire.ec.europa.eu/theme/theme.el.atom'
    Checking URL: 'http://inspire.ec.europa.eu/theme/theme.en.atom'
    Checking URL: 'http://inspire.ec.europa.eu/theme/theme.es.atom'
    Checking URL: 'http://inspire.ec.europa.eu/theme/theme.fr.atom'
    Checking URL: 'http://inspire.ec.europa.eu/theme/theme.hr.atom'
    Checking URL: 'http://inspire.ec.europa.eu/theme/theme.it.atom'
    Checking URL: 'http://inspire.ec.europa.eu/theme/theme.lv.atom'
    Checking URL: 'http://inspire.ec.europa.eu/theme/theme.lt.atom'
    Checking URL: 'http://inspire.ec.europa.eu/theme/theme.hu.atom'
    Checking URL: 'http://inspire.ec.europa.eu/theme/theme.mt.atom'
    Checking URL: 'http://inspire.ec.europa.eu/theme/theme.nl.atom'
    Checking URL: 'http://inspire.ec.europa.eu/theme/theme.pl.atom'
    Checking URL: 'http://inspire.ec.europa.eu/theme/theme.pt.atom'
    Checking URL: 'http://inspire.ec.europa.eu/theme/theme.ro.atom'
    Checking URL: 'http://inspire.ec.europa.eu/theme/theme.sk.atom'
    Checking URL: 'http://inspire.ec.europa.eu/theme/theme.sl.atom'
    Checking URL: 'http://inspire.ec.europa.eu/theme/theme.fi.atom'
    Checking URL: 'http://inspire.ec.europa.eu/theme/theme.sv.atom'
    Checking URL: 'http://inspire.ec.europa.eu/theme/theme.en.atom'
    Test Assertion 'md datasets-and-series 1.4: INSPIRE Theme Keyword': PASSED - 612 ms
    Test Assertion 'md datasets-and-series 1.5: Spatial Resolution': PASSED - 0 ms
    Test Assertion 'md datasets-and-series 1.6: Resource Language': PASSED - 1 ms
    Test Assertion 'md datasets-and-series 1.7: Topic Category': PASSED - 0 ms
    Test Case 'Identification' finished: PASSED
    Test Case 'Distribution' started
    Test Assertion 'md datasets-and-series 1.8: Resource Locator': PASSED - 0 ms
    Test Assertion 'md datasets-and-series 1.9: Data Quality Info Section': PASSED - 0 ms
    Code list value: REGLAMENTO (UE) N o 1089/2010 DE LA COMISIÓN de 23 de noviembre de 2010 por el que se aplica la Directiva 2007/2/CE del Parlamento Europeo y del Consejo en lo que se refiere a la interoperabilidad de los conjuntos y los servicios de datos espaciales
    Code list value: publication
    Test Assertion 'md datasets-and-series 1.10: Dataset Conformity': PASSED - 71 ms
    Test Assertion 'md datasets-and-series 1.11: Lineage': PASSED - 1 ms
    Test Case 'Distribution' finished: PASSED
    Test Suite 'Conformance Class 1: INSPIRE data sets and data set series baseline metadata.' finished: PASSED

### Log path: Conformance Class 2: INSPIRE data sets and data set series interoperability metadata.

    Testing 1 records
    Executing Test Suite: /etf/projects/inspire-ets-repository/ets-repository-2024.2/metadata/2.0/datasets-and-series/ets-md-isdss-bsxets.xml
    Statistics table: 11 ms
    Test Suite 'Conformance Class 2: INSPIRE data sets and data set series interoperability metadata.' started
    Test Case 'General Metadata' started
    Test Assertion 'md isdss 2.1: Coordinate Reference System': PASSED - 0 ms
    Test Assertion 'md isdss 2.2: Coordinate Reference System Identifiers': PASSED - 34 ms
    Test Assertion 'md isdss 2.3: Temporal Reference Systems': PASSED - 0 ms
    Test Case 'General Metadata' finished: PASSED
    Test Case 'Identification' started
    Test Assertion 'md isdss 2.4: Spatial Representation Type': PASSED - 1 ms
    Test Assertion 'md isdss 2.5: Character Encoding': PASSED - 0 ms
    Test Case 'Identification' finished: PASSED
    Test Case 'Distribution' started
    Test Assertion 'md isdss 2.6: Data Encoding': PASSED - 0 ms
    Test Case 'Distribution' finished: PASSED
    Test Case 'Data Quality' started
    Test Assertion 'md isdss 2.7: Topological Consistency Quantitative Results': PASSED - 0 ms
    Test Assertion 'md isdss 2.8: Topological Consistency Descriptive Results': PASSED - 0 ms
    Test Case 'Data Quality' finished: PASSED
    Test Suite 'Conformance Class 2: INSPIRE data sets and data set series interoperability metadata.' finished: PASSED

### Log path: Conformance Class 2b: INSPIRE data sets and data set series metadata for Monitoring

    Testing 1 records
    Executing Test Suite: /etf/projects/inspire-ets-repository/ets-repository-2024.2/metadata/2.0/datasets-and-series/ets-md-monitoring-bsxets.xml
    Statistics table: 9 ms
    Test Suite 'Conformance Class 2b: INSPIRE data sets and data set series metadata for Monitoring' started
    Test Case 'Monitoring requirements' started
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/SpatialScope/SpatialScope.bg.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/SpatialScope/SpatialScope.cs.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/SpatialScope/SpatialScope.da.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/SpatialScope/SpatialScope.de.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/SpatialScope/SpatialScope.et.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/SpatialScope/SpatialScope.el.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/SpatialScope/SpatialScope.en.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/SpatialScope/SpatialScope.es.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/SpatialScope/SpatialScope.fr.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/SpatialScope/SpatialScope.hr.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/SpatialScope/SpatialScope.it.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/SpatialScope/SpatialScope.lv.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/SpatialScope/SpatialScope.lt.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/SpatialScope/SpatialScope.hu.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/SpatialScope/SpatialScope.mt.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/SpatialScope/SpatialScope.nl.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/SpatialScope/SpatialScope.pl.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/SpatialScope/SpatialScope.pt.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/SpatialScope/SpatialScope.ro.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/SpatialScope/SpatialScope.sk.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/SpatialScope/SpatialScope.sl.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/SpatialScope/SpatialScope.fi.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/SpatialScope/SpatialScope.sv.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/SpatialScope/SpatialScope.en.atom'
    Test Assertion 'M.1: Spatial scope keyword': PASSED - 675 ms
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/PriorityDataset/PriorityDataset.bg.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/PriorityDataset/PriorityDataset.cs.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/PriorityDataset/PriorityDataset.da.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/PriorityDataset/PriorityDataset.de.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/PriorityDataset/PriorityDataset.et.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/PriorityDataset/PriorityDataset.el.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/PriorityDataset/PriorityDataset.en.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/PriorityDataset/PriorityDataset.es.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/PriorityDataset/PriorityDataset.fr.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/PriorityDataset/PriorityDataset.hr.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/PriorityDataset/PriorityDataset.it.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/PriorityDataset/PriorityDataset.lv.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/PriorityDataset/PriorityDataset.lt.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/PriorityDataset/PriorityDataset.hu.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/PriorityDataset/PriorityDataset.mt.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/PriorityDataset/PriorityDataset.nl.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/PriorityDataset/PriorityDataset.pl.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/PriorityDataset/PriorityDataset.pt.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/PriorityDataset/PriorityDataset.ro.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/PriorityDataset/PriorityDataset.sk.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/PriorityDataset/PriorityDataset.sl.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/PriorityDataset/PriorityDataset.fi.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/PriorityDataset/PriorityDataset.sv.atom'
    Checking URL: 'http://inspire.ec.europa.eu/metadata-codelist/PriorityDataset/PriorityDataset.en.atom'
    Test Assertion 'M.2: Priority datasets keyword': PASSED - 1673 ms
    Test Case 'Monitoring requirements' finished: PASSED
    Test Suite 'Conformance Class 2b: INSPIRE data sets and data set series metadata for Monitoring' finished: PASSED

## Common Requirements for ISO/TC 19139:2007 based INSPIRE metadata records.
3

Please report any issues or problems in GitHub.
Known limitations are documented in the description of the applicable test case or test assertion.
There is a general limitation in all assertions that polymorphism and containment by reference (see the Technical Guidance, sub-clauses A.3, A.4 and A.5) are not supported. However, the current Abstract Test Suite does not support polymorphism and references either (all XPath expressions do not support polymorhism or references; in addition, schema validation is only executed against the ISO/OGC schemas without extensions). It is therefore unclear if this is really a limitation or if the sections in the technical guidance are outdated.
Source: Common Requirements for ISO/TC 19139:2007 based INSPIRE metadata records

Status | Passed
Duration | 0.337 s
Test suite ID | EID59692c11-df86-49ad-be7f-94a1e1ddd8da
Author | Consortium Bilbomatica, Guadaltel y Geograma
Date created | 30/06/2018 00:00:00 GMT
Version | 1.0.13
Last editor | Consortium Bilbomatica, Guadaltel y Geograma
Last updated | 16/08/2022 13:00:00 GMT
Reference | Link
Hash | CBF29CE484222325

### General requirements
5
click to expand contents

Execute tests that apply for all metadata records on elements that are directly child elements of the root node of the XML document: MD_Metadata node.

Status | Passed
Duration | 0.228 s
Test case ID | EID61e7ffc0-c181-11e8-a355-529269fb1459

##### md common req C.1: XML Schema click to expand contents

Performs a schema validation of the document.

More information: XML Schema

Status | Passed
Duration | 0.218 s
Assertion ID | EID7c93c4d2-3942-4eb4-b5d3-4735d40262d8
Assertion URI | Link

Expression:let $messages := (for $record in $records let $rid := $record/gmd:fileIdentifier/*/text() let $result_0 := try{ validate:xsd($record, 'http://schemas.opengis.net/csw/2.0.2/profiles/apiso/1.0.0/apiso.xsd') } catch * { $err:description } let $result_1 := try{ if (not(string-length($result_0) = 0)) then validate:xsd($record, 'http://www.isotc211.org/2005/gmd/gmd.xsd') else () } catch * { $err:description } let $result_2 := try{ if (not(string-length($result_0) = 0 and string-length($result_1) = 0)) then validate:xsd($record, 'http://schemas.opengis.net/iso/19139/20070417/gmd/gmd.xsd') else () } catch * { $err:description } let $result_3 := try{ if (not(string-length($result_0) = 0 and string-length($result_1) = 0 and string-length($result_2) = 0)) then validate:xsd($record, 'https://inspire.ec.europa.eu/draft-schemas/inspire-md-schemas-temp/iso_19139_20060504/iso_19139_20060504_wrapper.xsd') else () } catch * { $err:description } return if(not(string-length($result_0) = 0 or string-length($result_1) = 0 or string-length($result_2) = 0 or string-length($result_3) = 0)) then local:addMessage('TR.errorValidatingSchema', map { 'filename': local:filename($record), 'id': $rid, 'description': string($result_0) }) else () )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

##### md common req C.2: Root Element click to expand contents

Test that the specification of a metadata is encoded through a root element MD_Metadata.

More information: Root Element

Status | Passed
Duration | 0.001 s
Assertion ID | EIDba885e87-dfec-4206-9a94-5620af734d44
Assertion URI | Link

Expression:let $messages := (for $record in $records let $rid := $record/gmd:fileIdentifier/*/text() return if(not($record/node-name() = QName('http://www.isotc211.org/2005/gmd','gmd:MD_Metadata'))) then local:addMessage('TR.invalidRootElement', map { 'filename': local:filename($record), 'id': namespace-uri($record) }) else () )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

##### md common req C.5: Language Code click to expand contents

Test that a resource language is given pointing to one of the official languages of the Community expressed in conformity with ISO 639-2

More information: Metadata Language

Status | Passed
Duration | 0.001 s
Assertion ID | EIDebdda4b4-0bb4-4255-a36a-db4fe540065c
Assertion URI | Link

Expression:let $recordsToInspect := $records[gmd:hierarchyLevel/gmd:MD_ScopeCode/@codeListValue = ('dataset','series','service')] let $codes := ('bul', 'hrv', 'cze', 'dan', 'dut', 'eng', 'est', 'fin', 'fre', 'ger', 'gre', 'hun', 'gle', 'ice', 'ita', 'lav', 'lit', 'mlt', 'nor', 'pol', 'por', 'rum', 'slo', 'slv', 'spa', 'swe') let $messages := if (not($recordsToInspect)) then () else (for $record in $recordsToInspect let $rid := $record/gmd:fileIdentifier/*/text() let $languageCodes := $record/gmd:language/gmd:LanguageCode return if (not($languageCodes)) then local:addMessage('TR.noLanguageCode', map { 'filename': local:filename($record), 'id': $rid }) else if (count($languageCodes) != 1) then local:addMessage('TR.wrongLanguageCodeNumber', map { 'filename': local:filename($record), 'id': $rid }) else if ($languageCodes/@codeList != 'http://www.loc.gov/standards/iso639-2/' and $languageCodes/@codeList != 'https://www.loc.gov/standards/iso639-2/' and $languageCodes/@codeList != 'http://www.loc.gov/standards/iso639-2' and $languageCodes/@codeList != 'https://www.loc.gov/standards/iso639-2'and $languageCodes/@codeList != 'http://id.loc.gov/vocabulary/iso639-2/' and $languageCodes/@codeList != 'https://id.loc.gov/vocabulary/iso639-2/' and $languageCodes/@codeList != 'http://id.loc.gov/vocabulary/iso639-2' and $languageCodes/@codeList != 'https://id.loc.gov/vocabulary/iso639-2') then local:addMessage('TR.wrongCodeList_Param', map { 'filename': local:filename($record), 'id': $rid, 'param': 'http://www.loc.gov/standards/iso639-2/ or http://id.loc.gov/vocabulary/iso639-2'}) else if ($languageCodes/@codeListValue[not(. = $codes)]) then local:addMessage('TR.invalidLanguageCode', map { 'filename': local:filename($record), 'id': $rid, 'invalidCodes' : $languageCodes/@codeListValue/string()}) else () )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

##### md common req C.6: Metadata Point of Contact click to expand contents

Test that the description of the organisation responsible for the creation and maintenance of the metadata is provided.

More information: Metadata Point of Contact

Status | Passed
Duration | 0.001 s
Assertion ID | EIDead447bf-7ace-4b13-b9b1-a80f8566c9cb
Assertion URI | Link

Expression:let $messages := (for $record in $records let $rid := $record/gmd:fileIdentifier/*/text() let $pocs := $record/gmd:contact/gmd:CI_ResponsibleParty let $iso19115_CIRoleCode := ('resourceProvider','custodian','owner','user','distributor','originator','pointOfContact','principalInvestigator','processor','publisher','author') let $RoleCodes := $pocs/gmd:role/gmd:CI_RoleCode let $pointOfContact := (for $y in $RoleCodes return if ($y/@codeListValue = 'pointOfContact') then $y/@codeListValue else ()) let $invalidCodeListValues := (for $y in $RoleCodes return if ($y/@codeListValue = $iso19115_CIRoleCode) then () else $y/@codeListValue) return if (not($pocs)) then local:addMessage('TR.noMetadataContact', map { 'filename': local:filename($record), 'id': $rid }) else if (count($pointOfContact) = 0) then local:addMessage('TR.invalidMetadataContactRoleCodeListValue', map { 'filename': local:filename($record), 'id': $rid, 'poc': '0 pointOfContact'}) else if (not(count($invalidCodeListValues) = 0)) then (for $codeListValue in $invalidCodeListValues return local:addMessage('TR.invalidMetadataContactRoleCodeListValue', map { 'filename': local:filename($record), 'id': $rid, 'poc': fn:string($codeListValue)})) else for $poc in $pocs let $orgName := $poc/gmd:organisationName let $email := $poc/gmd:contactInfo/gmd:CI_Contact/gmd:address/gmd:CI_Address/gmd:electronicMailAddress let $emptyEmail := for $x in $email where (not(string-length($x/gco:CharacterString/text()) != 0 or string-length($x/gmx:Anchor/text()) != 0)) return $x return if (not($orgName) or not(string-length($orgName/gco:CharacterString/text()) != 0 or string-length($orgName/gmx:Anchor/text()) != 0)) then local:addMessage('TR.noMetadataContactOrganisationName', map { 'filename': local:filename($record), 'id': $rid }) else if (not($email) or count($emptyEmail) > 0) then local:addMessage('TR.noMetadataContactEmailAddress', map { 'filename': local:filename($record), 'id': $rid }) else if (not($poc/gmd:role)) then local:addMessage('TR.noMetadataContactRole', map { 'filename': local:filename($record), 'id': $rid}) else () )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

##### md common req C.7: Metadata Date click to expand contents

Test that the document indicates the date when the metadata record was created or updated.

More information: Metadata Date

Status | Passed
Duration | 0.009 s
Assertion ID | EID0b6c9678-31d1-4c7a-8183-6a4f4da60017
Assertion URI | Link

Expression:let $levels := ('dataset', 'series', 'service') let $recordsToInspect := $records[gmd:hierarchyLevel/gmd:MD_ScopeCode/@codeListValue = $levels] let $regexDate := '(^([0-9]{2})$)|(^([0-9]{4})$)|(^([0-9]{4})-(1[0-2]|0[1-9])$)|((^[0-9]{4}-(0[13-9]|1[0-2])-(0[1-9]|[12][0-9]|30)$)|(^[0-9]{4}-(0[13578]|1[02])-31$)|(^[0-9]{4}-02-(0[1-9]|1[0-9]|2[0-8])$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))-02-29$)|(^(([02468][048])|([13579][26]))00-02-29$))|((^[0-9]{4}(0[13-9]|1[0-2])(0[1-9]|[12][0-9]|30)$)|(^[0-9]{4}(0[13578]|1[02])31$)|(^[0-9]{4}02(0[1-9]|1[0-9]|2[0-8])$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))0229$)|(^(([02468][048])|([13579][26]))000229$))|((^[0-9]{4}-(00[1-9]|0[1-9][0-9]|[12][0-9]{2}|3[0-5][0-9]|36[0-5])$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))-366$)|(^(([02468][048])|([13579][26]))00-366$))|((^[0-9]{4}(00[1-9]|0[1-9][0-9]|[12][0-9]{2}|3[0-5][0-9]|36[0-5])$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))366$)|(^(([02468][048])|([13579][26]))00366$))|(^[0-9]{4}-W(0[1-9]|[1-4][0-9]|5[0-2])$)|((^(([02468][048])|([13579][26]))(04|09|15|20|26|32|37|43|48|54|60|65|71|76|82|88|93|99)-W53$)|(^(([02468][159])|([13579][37]))(05|11|16|22|28|33|39|44|50|56|61|67|72|78|84|89|95)-W53$)|(^(([02468][26])|([13579][048]))(01|07|12|18|24|29|35|40|46|52|57|63|68|71|80|85|91|96)-W53$)|(^(([02468][37])|([13579][159]))(03|08|14|20|25|31|36|42|48|53|59|64|70|76|81|87|92|98)-W53$))|((^[0-9]{4}W(0[1-9]|[1-4][0-9]|5[0-2])$))|((^(([02468][048])|([13579][26]))(04|09|15|20|26|32|37|43|48|54|60|65|71|76|82|88|93|99)W53$)|(^(([02468][159])|([13579][37]))(05|11|16|22|28|33|39|44|50|56|61|67|72|78|84|89|95)W53$)|(^(([02468][26])|([13579][048]))(01|07|12|18|24|29|35|40|46|52|57|63|68|71|80|85|91|96)W53$)|(^(([02468][37])|([13579][159]))(03|08|14|20|25|31|36|42|48|53|59|64|70|76|81|87|92|98)W53$))|(^[0-9]{4}-W(0[1-9]|[1-4][0-9]|5[0-2])-[1-7]$)|((^(([02468][048])|([13579][26]))(04|09|15|20|26|32|37|43|48|54|60|65|71|76|82|88|93|99)-W53-[1-7]$)|(^(([02468][159])|([13579][37]))(05|11|16|22|28|33|39|44|50|56|61|67|72|78|84|89|95)-W53-[1-7]$)|(^(([02468][26])|([13579][048]))(01|07|12|18|24|29|35|40|46|52|57|63|68|71|80|85|91|96)-W53-[1-7]$)|(^(([02468][37])|([13579][159]))(03|08|14|20|25|31|36|42|48|53|59|64|70|76|81|87|92|98)-W53-[1-7]$))|(^[0-9]{4}W(0[1-9]|[1-4][0-9]|5[0-2])[1-7]$)|((^(([02468][048])|([13579][26]))(04|09|15|20|26|32|37|43|48|54|60|65|71|76|82|88|93|99)W53[1-7]$)|(^(([02468][159])|([13579][37]))(05|11|16|22|28|33|39|44|50|56|61|67|72|78|84|89|95)W53[1-7]$)|(^(([02468][26])|([13579][048]))(01|07|12|18|24|29|35|40|46|52|57|63|68|71|80|85|91|96)W53[1-7]$)|(^(([02468][37])|([13579][159]))(03|08|14|20|25|31|36|42|48|53|59|64|70|76|81|87|92|98)W53[1-7]$))' let $regexDateTime := '((^[0-9]{4}-(0[13-9]|1[0-2])-((0[1-9]|[12][0-9]|30))T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?Z$)|(^[0-9]{4}-(0[13578]|1[02])-31T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?Z$)|(^[0-9]{4}-02-([01][0-9]|2[0-8])T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?Z$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))-02-29T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?Z$)|(^(([02468][048])|([13579][26]))00-02-29T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?Z$))|((^((19(8[1-35]|9[2-47]))|(20(1[25])))-06-30T23:59:60((\.|,)0+)?Z$)|(^((19(7[1-9]|8[79]|9[058]))|(20(0[58]|16)))-12-31T23:59:60((\.|,)0+)?Z$))|((^[0-9]{4}(0[13-9]|1[0-2])((0[1-9]|[12][0-9]|30))T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?Z$)|(^[0-9]{4}(0[13578]|1[02])31T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?Z$)|(^[0-9]{4}02([01][0-9]|2[0-8])T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?Z$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))0229T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?Z$)|(^(([02468][048])|([13579][26]))000229T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?Z$))|((^((19(8[1-35]|9[2-47]))|(20(1[25])))0630T235960((\.|,)0+)?Z$)|(^((19(7[1-9]|8[79]|9[058]))|(20(0[58]|16)))1231T235960((\.|,)0+)?Z$))|((^[0-9]{4}-(0[13-9]|1[0-2])-((0[1-9]|[12][0-9]|30))T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?$)|(^[0-9]{4}-(0[13578]|1[02])-31T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?$)|(^[0-9]{4}-02-([01][0-9]|2[0-8])T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))-02-29T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?$)|(^(([02468][048])|([13579][26]))00-02-29T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?$))|((^((19(8[1-35]|9[2-47]))|(20(1[25])))-06-30T23:59:60((\.|,)0+)?$)|(^((19(7[1-9]|8[79]|9[058]))|(20(0[58]|16)))-12-31T23:59:60((\.|,)0+)?$))|((^[0-9]{4}(0[13-9]|1[0-2])((0[1-9]|[12][0-9]|30))T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?$)|(^[0-9]{4}(0[13578]|1[02])31T([01][0-9]|2[0-3])[0-5][0-9][0-5][0-9]$)|(^[0-9]{4}02([01][0-9]|2[0-8])T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))0229T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?$)|(^(([02468][048])|([13579][26]))000229T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?$))|((^((19(8[1-35]|9[2-47]))|(20(1[25])))0630T235960((\.|,)0+)?$)|(^((19(7[1-9]|8[79]|9[058]))|(20(0[58]|16)))1231T235960((\.|,)0+)?$))|((^[0-9]{4}-(0[13-9]|1[0-2])-((0[1-9]|[12][0-9]|30))T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4]))):00)|(((-0[39])|(\+(0[3-6]|10))):30)|((\+(0[58]|12)):45))$)|(^[0-9]{4}-(0[13578]|1[02])-31T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4]))):00)|(((-0[39])|(\+(0[3-6]|10))):30)|((\+(0[58]|12)):45))$)|(^[0-9]{4}-02-(0[1-9]|1[0-9]|2[0-8])T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4]))):00)|(((-0[39])|(\+(0[3-6]|10))):30)|((\+(0[58]|12)):45))$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))-02-29T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4]))):00)|(((-0[39])|(\+(0[3-6]|10))):30)|((\+(0[58]|12)):45))$)|(^(([02468][048])|([13579][26]))00-02-29T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4]))):00)|(((-0[39])|(\+(0[3-6]|10))):30)|((\+(0[58]|12)):45))$))|((^[0-9]{4}(0[13-9]|1[0-2])((0[1-9]|[12][0-9]|30))T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))00)|(((-0[39])|(\+(0[3-6]|10)))30)|((\+(0[58]|12))45))$)|(^[0-9]{4}(0[13578]|1[02])31T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))00)|(((-0[39])|(\+(0[3-6]|10)))30)|((\+(0[58]|12))45))$)|(^[0-9]{4}02(0[1-9]|1[0-9]|2[0-8])T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))00)|(((-0[39])|(\+(0[3-6]|10)))30)|((\+(0[58]|12))45))$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))0229T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))00)|(((-0[39])|(\+(0[3-6]|10)))30)|((\+(0[58]|12))45))$)|(^(([02468][048])|([13579][26]))000229T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))00)|(((-0[39])|(\+(0[3-6]|10)))30)|((\+(0[58]|12))45))$))|((^[0-9]{4}-(0[13-9]|1[0-2])-((0[1-9]|[12][0-9]|30))T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$)|(^[0-9]{4}-(0[13578]|1[02])-31T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$)|(^[0-9]{4}-02-(0[1-9]|1[0-9]|2[0-8])T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))-02-29T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$)|(^(([02468][048])|([13579][26]))00-02-29T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$))|((^[0-9]{4}(0[13-9]|1[0-2])((0[1-9]|[12][0-9]|30))T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$)|(^[0-9]{4}(0[13578]|1[02])31T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$)|(^[0-9]{4}02(0[1-9]|1[0-9]|2[0-8])T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))0229T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$)|(^(([02468][048])|([13579][26]))000229T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$))' let $messages := (for $record in $recordsToInspect let $rid := $record/gmd:fileIdentifier/*/text() return if (count($record/gmd:dateStamp) != 1 or not(count($record/gmd:dateStamp/gco:DateTime) + count($record/gmd:dateStamp/gco:Date) = 1)) then local:addMessage('TR.oneDateStamp', map { 'filename': local:filename($record), 'id': $rid }) else if(count($record/gmd:dateStamp/gco:DateTime) = 1) then if (not(matches($record/gmd:dateStamp/gco:DateTime, $regexDateTime))) then local:addMessage('TR.wrongDateFormat', map { 'filename': local:filename($record), 'id': $rid }) else() else if(count($record/gmd:dateStamp/gco:Date) = 1) then if (not(matches($record/gmd:dateStamp/gco:Date, $regexDate))) then local:addMessage('TR.wrongDateFormat', map { 'filename': local:filename($record), 'id': $rid }) else() else () )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

### Identification
12
click to expand contents

Execute tests that apply for all metadata records on elements that are child elements of the section of the XML document: Identification Info (property of the gmd:MD_Metadata element). This section contains information specific to the dataset / dataset series.

Status | Passed
Duration | 0.094 s
Test case ID | EID61e80286-c181-11e8-a355-529269fb1459

##### md common req C.8: Resource Title click to expand contents

Test that a non-empty title of the described data is provided.

More information: Resource Title

Status | Passed
Duration | 0.001 s
Assertion ID | EID34195fe7-0d77-46bb-b74e-489463cadd2f
Assertion URI | Link

Expression:let $messages := (for $record in $records let $rid := $record/gmd:fileIdentifier/*/text() let $title := if ($record/gmd:hierarchyLevel/gmd:MD_ScopeCode/@codeListValue = 'service') then $record/gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:citation/gmd:CI_Citation/gmd:title else $record/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:title let $rid := $record/gmd:fileIdentifier/*/text() return if (not($title)) then local:addMessage('TR.noTitle', map { 'filename': local:filename($record), 'id': $rid }) else if (count($title) != 1) then local:addMessage('TR.noTitle', map { 'filename': local:filename($record), 'id': $rid }) else if (not($title) or not(string-length($title/gco:CharacterString) != 0 or string-length($title/gmx:Anchor) != 0)) then local:addMessage('TR.emptyTitle', map { 'filename': local:filename($record), 'id': $rid }) else () )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

##### md common req C.9: Resource Abstract click to expand contents

Test that a resource abstract is provided.

More information: Resource Abstract

Status | Passed
Duration | 0.001 s
Assertion ID | EID346ca433-1f21-4e4e-8fec-524d24fd6647
Assertion URI | Link

Expression:let $messages := ( for $record in $records let $rid := $record/gmd:fileIdentifier/*/text() let $abstract := if ($record/gmd:hierarchyLevel/gmd:MD_ScopeCode/@codeListValue = 'service') then $record/gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:abstract else $record/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:abstract return if (not($abstract)) then local:addMessage('TR.noAbstract', map { 'filename': local:filename($record), 'id': $rid }) else if (count($abstract) != 1) then local:addMessage('TR.noAbstract', map { 'filename': local:filename($record), 'id': $rid }) else if (not($abstract) or not(string-length($abstract/gco:CharacterString) != 0 or string-length($abstract/gmx:Anchor) != 0)) then local:addMessage('TR.emptyAbstract', map { 'filename': local:filename($record), 'id': $rid }) else () )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

##### md common req C.10: Responsible Organization click to expand contents

Test that the responsible organization metadata is provided

More information: Responsible Organization

Status | Passed
Duration | 0.020 s
Assertion ID | EID87ee2219-2ba5-4a27-91ac-2b3bf5730012
Assertion URI | Link

Expression:let $iso19115_CIRoleCode := ('resourceProvider','custodian','owner','user','distributor','originator','pointOfContact','principalInvestigator','processor','publisher','author') let $messages := (for $record in $records let $rid := $record/gmd:fileIdentifier/*/text() let $pocs := if ($record/gmd:hierarchyLevel/gmd:MD_ScopeCode/@codeListValue = 'service') then $record/gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:pointOfContact/gmd:CI_ResponsibleParty else $record/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:pointOfContact/gmd:CI_ResponsibleParty return if(not($pocs)) then local:addMessage('TR.missingResponsibleParty', map { 'filename': local:filename($record), 'id': $rid }) else for $poc in $pocs let $orgName := $poc/gmd:organisationName let $email := for $y in $poc/gmd:contactInfo/gmd:CI_Contact/gmd:address/gmd:CI_Address return $y/gmd:electronicMailAddress let $emailChar := for $y in $poc/gmd:contactInfo/gmd:CI_Contact/gmd:address/gmd:CI_Address/gmd:electronicMailAddress return if ($y/gco:CharacterString/text() != '') then $y else () let $emailAnc := for $y in $poc/gmd:contactInfo/gmd:CI_Contact/gmd:address/gmd:CI_Address/gmd:electronicMailAddress return if ($y/gmx:Anchor/text() != '') then $y else () let $a := local:log('Email Char: ' || count($emailChar)) let $b := local:log('Email Anch: ' || count($emailAnc)) return if (not($orgName) or not(string-length($orgName/gco:CharacterString/text()) != 0 or string-length($orgName/gmx:Anchor/text()) != 0)) then local:addMessage('TR.noMetadataContactOrganisationName', map { 'filename': local:filename($record), 'id': $rid }) else if (count($email) = 0 or count($emailChar) + count($emailAnc) != count($email)) then local:addMessage('TR.noMetadataContactEmailAddress', map { 'filename': local:filename($record), 'id': $rid }) else if (not($poc/gmd:role) or not($poc/gmd:role/gmd:CI_RoleCode/@codeListValue = $iso19115_CIRoleCode)) then local:addMessage('TR.noPointOfContactRole', map { 'filename': local:filename($record), 'id': $rid }) else () )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

##### md common req C.11: Temporal Reference click to expand contents

Test that there is at least one temporal reference and it is codified correctly.

More information: Temporal Reference

Status | Passed
Duration | 0.029 s
Assertion ID | EID01ae1fe1-1990-4716-ae09-88d1208b408c
Assertion URI | Link

Expression:let $regexDate := '(^([0-9]{2})$)|(^([0-9]{4})$)|(^([0-9]{4})-(1[0-2]|0[1-9])$)|((^[0-9]{4}-(0[13-9]|1[0-2])-(0[1-9]|[12][0-9]|30)$)|(^[0-9]{4}-(0[13578]|1[02])-31$)|(^[0-9]{4}-02-(0[1-9]|1[0-9]|2[0-8])$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))-02-29$)|(^(([02468][048])|([13579][26]))00-02-29$))|((^[0-9]{4}(0[13-9]|1[0-2])(0[1-9]|[12][0-9]|30)$)|(^[0-9]{4}(0[13578]|1[02])31$)|(^[0-9]{4}02(0[1-9]|1[0-9]|2[0-8])$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))0229$)|(^(([02468][048])|([13579][26]))000229$))|((^[0-9]{4}-(00[1-9]|0[1-9][0-9]|[12][0-9]{2}|3[0-5][0-9]|36[0-5])$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))-366$)|(^(([02468][048])|([13579][26]))00-366$))|((^[0-9]{4}(00[1-9]|0[1-9][0-9]|[12][0-9]{2}|3[0-5][0-9]|36[0-5])$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))366$)|(^(([02468][048])|([13579][26]))00366$))|(^[0-9]{4}-W(0[1-9]|[1-4][0-9]|5[0-2])$)|((^(([02468][048])|([13579][26]))(04|09|15|20|26|32|37|43|48|54|60|65|71|76|82|88|93|99)-W53$)|(^(([02468][159])|([13579][37]))(05|11|16|22|28|33|39|44|50|56|61|67|72|78|84|89|95)-W53$)|(^(([02468][26])|([13579][048]))(01|07|12|18|24|29|35|40|46|52|57|63|68|71|80|85|91|96)-W53$)|(^(([02468][37])|([13579][159]))(03|08|14|20|25|31|36|42|48|53|59|64|70|76|81|87|92|98)-W53$))|((^[0-9]{4}W(0[1-9]|[1-4][0-9]|5[0-2])$))|((^(([02468][048])|([13579][26]))(04|09|15|20|26|32|37|43|48|54|60|65|71|76|82|88|93|99)W53$)|(^(([02468][159])|([13579][37]))(05|11|16|22|28|33|39|44|50|56|61|67|72|78|84|89|95)W53$)|(^(([02468][26])|([13579][048]))(01|07|12|18|24|29|35|40|46|52|57|63|68|71|80|85|91|96)W53$)|(^(([02468][37])|([13579][159]))(03|08|14|20|25|31|36|42|48|53|59|64|70|76|81|87|92|98)W53$))|(^[0-9]{4}-W(0[1-9]|[1-4][0-9]|5[0-2])-[1-7]$)|((^(([02468][048])|([13579][26]))(04|09|15|20|26|32|37|43|48|54|60|65|71|76|82|88|93|99)-W53-[1-7]$)|(^(([02468][159])|([13579][37]))(05|11|16|22|28|33|39|44|50|56|61|67|72|78|84|89|95)-W53-[1-7]$)|(^(([02468][26])|([13579][048]))(01|07|12|18|24|29|35|40|46|52|57|63|68|71|80|85|91|96)-W53-[1-7]$)|(^(([02468][37])|([13579][159]))(03|08|14|20|25|31|36|42|48|53|59|64|70|76|81|87|92|98)-W53-[1-7]$))|(^[0-9]{4}W(0[1-9]|[1-4][0-9]|5[0-2])[1-7]$)|((^(([02468][048])|([13579][26]))(04|09|15|20|26|32|37|43|48|54|60|65|71|76|82|88|93|99)W53[1-7]$)|(^(([02468][159])|([13579][37]))(05|11|16|22|28|33|39|44|50|56|61|67|72|78|84|89|95)W53[1-7]$)|(^(([02468][26])|([13579][048]))(01|07|12|18|24|29|35|40|46|52|57|63|68|71|80|85|91|96)W53[1-7]$)|(^(([02468][37])|([13579][159]))(03|08|14|20|25|31|36|42|48|53|59|64|70|76|81|87|92|98)W53[1-7]$))' let $regexDateTime := '((^[0-9]{4}-(0[13-9]|1[0-2])-((0[1-9]|[12][0-9]|30))T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?Z$)|(^[0-9]{4}-(0[13578]|1[02])-31T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?Z$)|(^[0-9]{4}-02-([01][0-9]|2[0-8])T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?Z$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))-02-29T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?Z$)|(^(([02468][048])|([13579][26]))00-02-29T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?Z$))|((^((19(8[1-35]|9[2-47]))|(20(1[25])))-06-30T23:59:60((\.|,)0+)?Z$)|(^((19(7[1-9]|8[79]|9[058]))|(20(0[58]|16)))-12-31T23:59:60((\.|,)0+)?Z$))|((^[0-9]{4}(0[13-9]|1[0-2])((0[1-9]|[12][0-9]|30))T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?Z$)|(^[0-9]{4}(0[13578]|1[02])31T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?Z$)|(^[0-9]{4}02([01][0-9]|2[0-8])T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?Z$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))0229T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?Z$)|(^(([02468][048])|([13579][26]))000229T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?Z$))|((^((19(8[1-35]|9[2-47]))|(20(1[25])))0630T235960((\.|,)0+)?Z$)|(^((19(7[1-9]|8[79]|9[058]))|(20(0[58]|16)))1231T235960((\.|,)0+)?Z$))|((^[0-9]{4}-(0[13-9]|1[0-2])-((0[1-9]|[12][0-9]|30))T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?$)|(^[0-9]{4}-(0[13578]|1[02])-31T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?$)|(^[0-9]{4}-02-([01][0-9]|2[0-8])T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))-02-29T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?$)|(^(([02468][048])|([13579][26]))00-02-29T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?$))|((^((19(8[1-35]|9[2-47]))|(20(1[25])))-06-30T23:59:60((\.|,)0+)?$)|(^((19(7[1-9]|8[79]|9[058]))|(20(0[58]|16)))-12-31T23:59:60((\.|,)0+)?$))|((^[0-9]{4}(0[13-9]|1[0-2])((0[1-9]|[12][0-9]|30))T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?$)|(^[0-9]{4}(0[13578]|1[02])31T([01][0-9]|2[0-3])[0-5][0-9][0-5][0-9]$)|(^[0-9]{4}02([01][0-9]|2[0-8])T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))0229T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?$)|(^(([02468][048])|([13579][26]))000229T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?$))|((^((19(8[1-35]|9[2-47]))|(20(1[25])))0630T235960((\.|,)0+)?$)|(^((19(7[1-9]|8[79]|9[058]))|(20(0[58]|16)))1231T235960((\.|,)0+)?$))|((^[0-9]{4}-(0[13-9]|1[0-2])-((0[1-9]|[12][0-9]|30))T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4]))):00)|(((-0[39])|(\+(0[3-6]|10))):30)|((\+(0[58]|12)):45))$)|(^[0-9]{4}-(0[13578]|1[02])-31T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4]))):00)|(((-0[39])|(\+(0[3-6]|10))):30)|((\+(0[58]|12)):45))$)|(^[0-9]{4}-02-(0[1-9]|1[0-9]|2[0-8])T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4]))):00)|(((-0[39])|(\+(0[3-6]|10))):30)|((\+(0[58]|12)):45))$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))-02-29T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4]))):00)|(((-0[39])|(\+(0[3-6]|10))):30)|((\+(0[58]|12)):45))$)|(^(([02468][048])|([13579][26]))00-02-29T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4]))):00)|(((-0[39])|(\+(0[3-6]|10))):30)|((\+(0[58]|12)):45))$))|((^[0-9]{4}(0[13-9]|1[0-2])((0[1-9]|[12][0-9]|30))T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))00)|(((-0[39])|(\+(0[3-6]|10)))30)|((\+(0[58]|12))45))$)|(^[0-9]{4}(0[13578]|1[02])31T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))00)|(((-0[39])|(\+(0[3-6]|10)))30)|((\+(0[58]|12))45))$)|(^[0-9]{4}02(0[1-9]|1[0-9]|2[0-8])T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))00)|(((-0[39])|(\+(0[3-6]|10)))30)|((\+(0[58]|12))45))$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))0229T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))00)|(((-0[39])|(\+(0[3-6]|10)))30)|((\+(0[58]|12))45))$)|(^(([02468][048])|([13579][26]))000229T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))00)|(((-0[39])|(\+(0[3-6]|10)))30)|((\+(0[58]|12))45))$))|((^[0-9]{4}-(0[13-9]|1[0-2])-((0[1-9]|[12][0-9]|30))T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$)|(^[0-9]{4}-(0[13578]|1[02])-31T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$)|(^[0-9]{4}-02-(0[1-9]|1[0-9]|2[0-8])T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))-02-29T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$)|(^(([02468][048])|([13579][26]))00-02-29T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$))|((^[0-9]{4}(0[13-9]|1[0-2])((0[1-9]|[12][0-9]|30))T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$)|(^[0-9]{4}(0[13578]|1[02])31T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$)|(^[0-9]{4}02(0[1-9]|1[0-9]|2[0-8])T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))0229T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$)|(^(([02468][048])|([13579][26]))000229T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$))' let $messages := (for $record in $records let $rid := $record/gmd:fileIdentifier/*/text() let $ci_dates := $record/gmd:identificationInfo[1]/*/gmd:citation/gmd:CI_Citation/gmd:date/gmd:CI_Date return (if(not($ci_dates/gmd:date)) then local:addMessage('TR.noRelevantDate', map { 'filename': local:filename($record), 'id': $rid }) else for $ci_date in $ci_dates let $dateType := $ci_date/gmd:dateType/gmd:CI_DateTypeCode return if (not($ci_date/gmd:date/gco:Date or $ci_date/gmd:date/gco:DateTime)) then local:addMessage('TR.noRelevantDate', map { 'filename': local:filename($record), 'id': $rid }) else if ($ci_date/gmd:date/gco:Date and not(matches($ci_date/gmd:date/gco:Date/text(),$regexDate))) then local:addMessage('TR.invalidDateFormat', map { 'filename': local:filename($record), 'id': $rid }) else if ($ci_date/gmd:date/gco:DateTime and not(matches($ci_date/gmd:date/gco:DateTime/text(),$regexDateTime))) then local:addMessage('TR.wrongDateFormat', map { 'filename': local:filename($record), 'id': $rid }) else if (not($dateType)) then local:addMessage('TR.noDateType', map { 'filename': local:filename($record), 'id': $rid }) else if (not($dateType/@codeListValue = ('publication','revision','creation'))) then local:addMessage('TR.noDateTypeForSpecification', map { 'filename': local:filename($record), 'id': $rid }) else()) )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

##### md common req C.12: Max One Date of Creation click to expand contents

Test that not more than one date of creation for the metadata is given

More information: Max One Date of Creation

Status | Passed
Duration | 0.001 s
Assertion ID | EID109cce73-7e80-432e-a3e0-450e231f4120
Assertion URI | Link

Expression:let $dt := ('CI_DateTypeCode','http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#CI_DateTypeCode') let $messages := (for $record in $records let $rid := $record/gmd:fileIdentifier/*/text() let $temporalReferences := $record/gmd:identificationInfo[1]/*/gmd:citation/gmd:CI_Citation/gmd:date/gmd:CI_Date let $creationTempRefs := $temporalReferences[gmd:dateType/*/@codeListValue = ('creation')] return if(count($creationTempRefs) ne 1 and count($creationTempRefs) ne 0) then local:addMessage('TR.moreThanOneCreationDate', map { 'filename': local:filename($record), 'id': $rid }) else () )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

##### md common req C.13: Not More than one Date of Last Revision click to expand contents

Test that not more than one date of last revision for the metadata is given.

More information: Max one Date of Last Revision

Status | Passed
Duration | 0.001 s
Assertion ID | EID6b4e043c-7624-4b3c-8b0c-bec547d2f8f6
Assertion URI | Link

Expression:let $dt := ('CI_DateTypeCode','http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#CI_DateTypeCode') let $messages := (for $record in $records let $rid := $record/gmd:fileIdentifier/*/text() let $temporalReferences := $record/gmd:identificationInfo[1]/*/gmd:citation/gmd:CI_Citation/gmd:date/gmd:CI_Date let $revisionTempRefs := $temporalReferences[gmd:dateType/*/@codeListValue = ('revision')] return if(count($revisionTempRefs) ne 1 and count($revisionTempRefs) ne 0) then local:addMessage('TR.moreThanOneCreationDate', map { 'filename': local:filename($record), 'id': $rid }) else () )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

##### md common req C.14: Temporal Extent click to expand contents

Test if a temporal reference is provided using the temporary extension. The temporal reference will be coded using an individual date or a period of time between two dates.

More information: Temporal Extent

Status | Passed
Duration | 0.044 s
Assertion ID | EID76f8fb3a-c00f-11e8-a355-529269fb1459
Assertion URI | Link

Expression:let $messages := (for $record in $records let $rid := $record/gmd:fileIdentifier/*/text() let $regex := '(^([0-9]{2})$)|(^([0-9]{4})$)|(^([0-9]{4})-(1[0-2]|0[1-9])$)|((^[0-9]{4}-(0[13-9]|1[0-2])-(0[1-9]|[12][0-9]|30)$)|(^[0-9]{4}-(0[13578]|1[02])-31$)|(^[0-9]{4}-02-(0[1-9]|1[0-9]|2[0-8])$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))-02-29$)|(^(([02468][048])|([13579][26]))00-02-29$))|((^[0-9]{4}(0[13-9]|1[0-2])(0[1-9]|[12][0-9]|30)$)|(^[0-9]{4}(0[13578]|1[02])31$)|(^[0-9]{4}02(0[1-9]|1[0-9]|2[0-8])$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))0229$)|(^(([02468][048])|([13579][26]))000229$))|((^[0-9]{4}-(00[1-9]|0[1-9][0-9]|[12][0-9]{2}|3[0-5][0-9]|36[0-5])$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))-366$)|(^(([02468][048])|([13579][26]))00-366$))|((^[0-9]{4}(00[1-9]|0[1-9][0-9]|[12][0-9]{2}|3[0-5][0-9]|36[0-5])$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))366$)|(^(([02468][048])|([13579][26]))00366$))|(^[0-9]{4}-W(0[1-9]|[1-4][0-9]|5[0-2])$)|((^(([02468][048])|([13579][26]))(04|09|15|20|26|32|37|43|48|54|60|65|71|76|82|88|93|99)-W53$)|(^(([02468][159])|([13579][37]))(05|11|16|22|28|33|39|44|50|56|61|67|72|78|84|89|95)-W53$)|(^(([02468][26])|([13579][048]))(01|07|12|18|24|29|35|40|46|52|57|63|68|71|80|85|91|96)-W53$)|(^(([02468][37])|([13579][159]))(03|08|14|20|25|31|36|42|48|53|59|64|70|76|81|87|92|98)-W53$))|((^[0-9]{4}W(0[1-9]|[1-4][0-9]|5[0-2])$))|((^(([02468][048])|([13579][26]))(04|09|15|20|26|32|37|43|48|54|60|65|71|76|82|88|93|99)W53$)|(^(([02468][159])|([13579][37]))(05|11|16|22|28|33|39|44|50|56|61|67|72|78|84|89|95)W53$)|(^(([02468][26])|([13579][048]))(01|07|12|18|24|29|35|40|46|52|57|63|68|71|80|85|91|96)W53$)|(^(([02468][37])|([13579][159]))(03|08|14|20|25|31|36|42|48|53|59|64|70|76|81|87|92|98)W53$))|(^[0-9]{4}-W(0[1-9]|[1-4][0-9]|5[0-2])-[1-7]$)|((^(([02468][048])|([13579][26]))(04|09|15|20|26|32|37|43|48|54|60|65|71|76|82|88|93|99)-W53-[1-7]$)|(^(([02468][159])|([13579][37]))(05|11|16|22|28|33|39|44|50|56|61|67|72|78|84|89|95)-W53-[1-7]$)|(^(([02468][26])|([13579][048]))(01|07|12|18|24|29|35|40|46|52|57|63|68|71|80|85|91|96)-W53-[1-7]$)|(^(([02468][37])|([13579][159]))(03|08|14|20|25|31|36|42|48|53|59|64|70|76|81|87|92|98)-W53-[1-7]$))|(^[0-9]{4}W(0[1-9]|[1-4][0-9]|5[0-2])[1-7]$)|((^(([02468][048])|([13579][26]))(04|09|15|20|26|32|37|43|48|54|60|65|71|76|82|88|93|99)W53[1-7]$)|(^(([02468][159])|([13579][37]))(05|11|16|22|28|33|39|44|50|56|61|67|72|78|84|89|95)W53[1-7]$)|(^(([02468][26])|([13579][048]))(01|07|12|18|24|29|35|40|46|52|57|63|68|71|80|85|91|96)W53[1-7]$)|(^(([02468][37])|([13579][159]))(03|08|14|20|25|31|36|42|48|53|59|64|70|76|81|87|92|98)W53[1-7]$))|((^[0-9]{4}-(0[13-9]|1[0-2])-((0[1-9]|[12][0-9]|30))T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?Z$)|(^[0-9]{4}-(0[13578]|1[02])-31T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?Z$)|(^[0-9]{4}-02-([01][0-9]|2[0-8])T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?Z$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))-02-29T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?Z$)|(^(([02468][048])|([13579][26]))00-02-29T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?Z$))|((^((19(8[1-35]|9[2-47]))|(20(1[25])))-06-30T23:59:60((\.|,)0+)?Z$)|(^((19(7[1-9]|8[79]|9[058]))|(20(0[58]|16)))-12-31T23:59:60((\.|,)0+)?Z$))|((^[0-9]{4}(0[13-9]|1[0-2])((0[1-9]|[12][0-9]|30))T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?Z$)|(^[0-9]{4}(0[13578]|1[02])31T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?Z$)|(^[0-9]{4}02([01][0-9]|2[0-8])T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?Z$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))0229T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?Z$)|(^(([02468][048])|([13579][26]))000229T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?Z$))|((^((19(8[1-35]|9[2-47]))|(20(1[25])))0630T235960((\.|,)0+)?Z$)|(^((19(7[1-9]|8[79]|9[058]))|(20(0[58]|16)))1231T235960((\.|,)0+)?Z$))|((^[0-9]{4}-(0[13-9]|1[0-2])-((0[1-9]|[12][0-9]|30))T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?$)|(^[0-9]{4}-(0[13578]|1[02])-31T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?$)|(^[0-9]{4}-02-([01][0-9]|2[0-8])T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))-02-29T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?$)|(^(([02468][048])|([13579][26]))00-02-29T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?$))|((^((19(8[1-35]|9[2-47]))|(20(1[25])))-06-30T23:59:60((\.|,)0+)?$)|(^((19(7[1-9]|8[79]|9[058]))|(20(0[58]|16)))-12-31T23:59:60((\.|,)0+)?$))|((^[0-9]{4}(0[13-9]|1[0-2])((0[1-9]|[12][0-9]|30))T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?$)|(^[0-9]{4}(0[13578]|1[02])31T([01][0-9]|2[0-3])[0-5][0-9][0-5][0-9]$)|(^[0-9]{4}02([01][0-9]|2[0-8])T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))0229T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?$)|(^(([02468][048])|([13579][26]))000229T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?$))|((^((19(8[1-35]|9[2-47]))|(20(1[25])))0630T235960((\.|,)0+)?$)|(^((19(7[1-9]|8[79]|9[058]))|(20(0[58]|16)))1231T235960((\.|,)0+)?$))|((^[0-9]{4}-(0[13-9]|1[0-2])-((0[1-9]|[12][0-9]|30))T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4]))):00)|(((-0[39])|(\+(0[3-6]|10))):30)|((\+(0[58]|12)):45))$)|(^[0-9]{4}-(0[13578]|1[02])-31T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4]))):00)|(((-0[39])|(\+(0[3-6]|10))):30)|((\+(0[58]|12)):45))$)|(^[0-9]{4}-02-(0[1-9]|1[0-9]|2[0-8])T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4]))):00)|(((-0[39])|(\+(0[3-6]|10))):30)|((\+(0[58]|12)):45))$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))-02-29T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4]))):00)|(((-0[39])|(\+(0[3-6]|10))):30)|((\+(0[58]|12)):45))$)|(^(([02468][048])|([13579][26]))00-02-29T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4]))):00)|(((-0[39])|(\+(0[3-6]|10))):30)|((\+(0[58]|12)):45))$))|((^[0-9]{4}(0[13-9]|1[0-2])((0[1-9]|[12][0-9]|30))T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))00)|(((-0[39])|(\+(0[3-6]|10)))30)|((\+(0[58]|12))45))$)|(^[0-9]{4}(0[13578]|1[02])31T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))00)|(((-0[39])|(\+(0[3-6]|10)))30)|((\+(0[58]|12))45))$)|(^[0-9]{4}02(0[1-9]|1[0-9]|2[0-8])T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))00)|(((-0[39])|(\+(0[3-6]|10)))30)|((\+(0[58]|12))45))$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))0229T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))00)|(((-0[39])|(\+(0[3-6]|10)))30)|((\+(0[58]|12))45))$)|(^(([02468][048])|([13579][26]))000229T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))00)|(((-0[39])|(\+(0[3-6]|10)))30)|((\+(0[58]|12))45))$))|((^[0-9]{4}-(0[13-9]|1[0-2])-((0[1-9]|[12][0-9]|30))T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$)|(^[0-9]{4}-(0[13578]|1[02])-31T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$)|(^[0-9]{4}-02-(0[1-9]|1[0-9]|2[0-8])T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))-02-29T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$)|(^(([02468][048])|([13579][26]))00-02-29T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$))|((^[0-9]{4}(0[13-9]|1[0-2])((0[1-9]|[12][0-9]|30))T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$)|(^[0-9]{4}(0[13578]|1[02])31T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$)|(^[0-9]{4}02(0[1-9]|1[0-9]|2[0-8])T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))0229T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$)|(^(([02468][048])|([13579][26]))000229T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$))' let $temporalExtentextents := $record/gmd:identificationInfo[1]/*/*:extent/gmd:EX_Extent/gmd:temporalElement/gmd:EX_TemporalExtent/gmd:extent return for $extent in $temporalExtentextents let $timePosition := $extent/*:TimeInstant/*:timePosition let $timePeriod := $extent/*:TimePeriod let $beginPosition := $extent/*:TimePeriod/*:beginPosition let $endPosition := $extent/*:TimePeriod/*:endPosition return if ($timePosition) then if (not($timePosition/@indeterminatePosition) and not(matches($timePosition/text(), $regex))) then local:addMessage('TR.wrongDateFormat', map { 'filename': local:filename($record), 'id': $rid }) else if($timePosition/@indeterminatePosition and not($timePosition/@indeterminatePosition = 'unknown' or $timePosition/@indeterminatePosition = 'now')) then local:addMessage('TR.wrongTimeIndeterminatePosition', map { 'filename': local:filename($record), 'id': $rid }) else () else if($timePeriod) then if (not($beginPosition/@indeterminatePosition) and not(matches($beginPosition/text(), $regex))) then local:addMessage('TR.wrongDateFormat', map { 'filename': local:filename($record), 'id': $rid }) else if ($beginPosition/@indeterminatePosition and not($beginPosition/@indeterminatePosition = 'unknown' or $beginPosition/@indeterminatePosition = 'before' or $beginPosition/@indeterminatePosition = 'now' or $beginPosition/@indeterminatePosition = 'after')) then local:addMessage('TR.wrongIndeterminatePosition', map { 'filename': local:filename($record), 'id': $rid }) else if (not($endPosition/@indeterminatePosition) and not(matches($endPosition/text(), $regex))) then local:addMessage('TR.wrongDateFormat', map { 'filename': local:filename($record), 'id': $rid }) else if ($endPosition/@indeterminatePosition and not($endPosition/@indeterminatePosition = 'unknown' or $endPosition/@indeterminatePosition = 'now' or $endPosition/@indeterminatePosition = 'before' or $endPosition/@indeterminatePosition = 'after')) then local:addMessage('TR.wrongIndeterminatePosition', map { 'filename': local:filename($record), 'id': $rid }) else () else local:addMessage('TR.noTimePositionOrPeriod', map { 'filename': local:filename($record), 'id': $rid }) )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

##### md common req C.15: Keyword Originating CV click to expand contents

Test that the citation of the source controlled vocabulary when giving the value of a keyword is provided correctly.

More information: Keyword Originating CV

Status | Passed
Duration | 0.001 s
Assertion ID | EID76f8ff36-c00f-11e8-a355-529269fb1459
Assertion URI | Link

Expression:let $regex := '(^([0-9]{2})$)|(^([0-9]{4})$)|(^([0-9]{4})-(1[0-2]|0[1-9])$)|((^[0-9]{4}-(0[13-9]|1[0-2])-(0[1-9]|[12][0-9]|30)$)|(^[0-9]{4}-(0[13578]|1[02])-31$)|(^[0-9]{4}-02-(0[1-9]|1[0-9]|2[0-8])$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))-02-29$)|(^(([02468][048])|([13579][26]))00-02-29$))|((^[0-9]{4}(0[13-9]|1[0-2])(0[1-9]|[12][0-9]|30)$)|(^[0-9]{4}(0[13578]|1[02])31$)|(^[0-9]{4}02(0[1-9]|1[0-9]|2[0-8])$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))0229$)|(^(([02468][048])|([13579][26]))000229$))|((^[0-9]{4}-(00[1-9]|0[1-9][0-9]|[12][0-9]{2}|3[0-5][0-9]|36[0-5])$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))-366$)|(^(([02468][048])|([13579][26]))00-366$))|((^[0-9]{4}(00[1-9]|0[1-9][0-9]|[12][0-9]{2}|3[0-5][0-9]|36[0-5])$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))366$)|(^(([02468][048])|([13579][26]))00366$))|(^[0-9]{4}-W(0[1-9]|[1-4][0-9]|5[0-2])$)|((^(([02468][048])|([13579][26]))(04|09|15|20|26|32|37|43|48|54|60|65|71|76|82|88|93|99)-W53$)|(^(([02468][159])|([13579][37]))(05|11|16|22|28|33|39|44|50|56|61|67|72|78|84|89|95)-W53$)|(^(([02468][26])|([13579][048]))(01|07|12|18|24|29|35|40|46|52|57|63|68|71|80|85|91|96)-W53$)|(^(([02468][37])|([13579][159]))(03|08|14|20|25|31|36|42|48|53|59|64|70|76|81|87|92|98)-W53$))|((^[0-9]{4}W(0[1-9]|[1-4][0-9]|5[0-2])$))|((^(([02468][048])|([13579][26]))(04|09|15|20|26|32|37|43|48|54|60|65|71|76|82|88|93|99)W53$)|(^(([02468][159])|([13579][37]))(05|11|16|22|28|33|39|44|50|56|61|67|72|78|84|89|95)W53$)|(^(([02468][26])|([13579][048]))(01|07|12|18|24|29|35|40|46|52|57|63|68|71|80|85|91|96)W53$)|(^(([02468][37])|([13579][159]))(03|08|14|20|25|31|36|42|48|53|59|64|70|76|81|87|92|98)W53$))|(^[0-9]{4}-W(0[1-9]|[1-4][0-9]|5[0-2])-[1-7]$)|((^(([02468][048])|([13579][26]))(04|09|15|20|26|32|37|43|48|54|60|65|71|76|82|88|93|99)-W53-[1-7]$)|(^(([02468][159])|([13579][37]))(05|11|16|22|28|33|39|44|50|56|61|67|72|78|84|89|95)-W53-[1-7]$)|(^(([02468][26])|([13579][048]))(01|07|12|18|24|29|35|40|46|52|57|63|68|71|80|85|91|96)-W53-[1-7]$)|(^(([02468][37])|([13579][159]))(03|08|14|20|25|31|36|42|48|53|59|64|70|76|81|87|92|98)-W53-[1-7]$))|(^[0-9]{4}W(0[1-9]|[1-4][0-9]|5[0-2])[1-7]$)|((^(([02468][048])|([13579][26]))(04|09|15|20|26|32|37|43|48|54|60|65|71|76|82|88|93|99)W53[1-7]$)|(^(([02468][159])|([13579][37]))(05|11|16|22|28|33|39|44|50|56|61|67|72|78|84|89|95)W53[1-7]$)|(^(([02468][26])|([13579][048]))(01|07|12|18|24|29|35|40|46|52|57|63|68|71|80|85|91|96)W53[1-7]$)|(^(([02468][37])|([13579][159]))(03|08|14|20|25|31|36|42|48|53|59|64|70|76|81|87|92|98)W53[1-7]$))|((^[0-9]{4}-(0[13-9]|1[0-2])-((0[1-9]|[12][0-9]|30))T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?Z$)|(^[0-9]{4}-(0[13578]|1[02])-31T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?Z$)|(^[0-9]{4}-02-([01][0-9]|2[0-8])T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?Z$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))-02-29T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?Z$)|(^(([02468][048])|([13579][26]))00-02-29T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?Z$))|((^((19(8[1-35]|9[2-47]))|(20(1[25])))-06-30T23:59:60((\.|,)0+)?Z$)|(^((19(7[1-9]|8[79]|9[058]))|(20(0[58]|16)))-12-31T23:59:60((\.|,)0+)?Z$))|((^[0-9]{4}(0[13-9]|1[0-2])((0[1-9]|[12][0-9]|30))T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?Z$)|(^[0-9]{4}(0[13578]|1[02])31T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?Z$)|(^[0-9]{4}02([01][0-9]|2[0-8])T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?Z$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))0229T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?Z$)|(^(([02468][048])|([13579][26]))000229T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?Z$))|((^((19(8[1-35]|9[2-47]))|(20(1[25])))0630T235960((\.|,)0+)?Z$)|(^((19(7[1-9]|8[79]|9[058]))|(20(0[58]|16)))1231T235960((\.|,)0+)?Z$))|((^[0-9]{4}-(0[13-9]|1[0-2])-((0[1-9]|[12][0-9]|30))T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?$)|(^[0-9]{4}-(0[13578]|1[02])-31T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?$)|(^[0-9]{4}-02-([01][0-9]|2[0-8])T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))-02-29T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?$)|(^(([02468][048])|([13579][26]))00-02-29T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?$))|((^((19(8[1-35]|9[2-47]))|(20(1[25])))-06-30T23:59:60((\.|,)0+)?$)|(^((19(7[1-9]|8[79]|9[058]))|(20(0[58]|16)))-12-31T23:59:60((\.|,)0+)?$))|((^[0-9]{4}(0[13-9]|1[0-2])((0[1-9]|[12][0-9]|30))T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?$)|(^[0-9]{4}(0[13578]|1[02])31T([01][0-9]|2[0-3])[0-5][0-9][0-5][0-9]$)|(^[0-9]{4}02([01][0-9]|2[0-8])T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))0229T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?$)|(^(([02468][048])|([13579][26]))000229T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?$))|((^((19(8[1-35]|9[2-47]))|(20(1[25])))0630T235960((\.|,)0+)?$)|(^((19(7[1-9]|8[79]|9[058]))|(20(0[58]|16)))1231T235960((\.|,)0+)?$))|((^[0-9]{4}-(0[13-9]|1[0-2])-((0[1-9]|[12][0-9]|30))T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4]))):00)|(((-0[39])|(\+(0[3-6]|10))):30)|((\+(0[58]|12)):45))$)|(^[0-9]{4}-(0[13578]|1[02])-31T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4]))):00)|(((-0[39])|(\+(0[3-6]|10))):30)|((\+(0[58]|12)):45))$)|(^[0-9]{4}-02-(0[1-9]|1[0-9]|2[0-8])T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4]))):00)|(((-0[39])|(\+(0[3-6]|10))):30)|((\+(0[58]|12)):45))$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))-02-29T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4]))):00)|(((-0[39])|(\+(0[3-6]|10))):30)|((\+(0[58]|12)):45))$)|(^(([02468][048])|([13579][26]))00-02-29T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4]))):00)|(((-0[39])|(\+(0[3-6]|10))):30)|((\+(0[58]|12)):45))$))|((^[0-9]{4}(0[13-9]|1[0-2])((0[1-9]|[12][0-9]|30))T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))00)|(((-0[39])|(\+(0[3-6]|10)))30)|((\+(0[58]|12))45))$)|(^[0-9]{4}(0[13578]|1[02])31T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))00)|(((-0[39])|(\+(0[3-6]|10)))30)|((\+(0[58]|12))45))$)|(^[0-9]{4}02(0[1-9]|1[0-9]|2[0-8])T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))00)|(((-0[39])|(\+(0[3-6]|10)))30)|((\+(0[58]|12))45))$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))0229T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))00)|(((-0[39])|(\+(0[3-6]|10)))30)|((\+(0[58]|12))45))$)|(^(([02468][048])|([13579][26]))000229T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))00)|(((-0[39])|(\+(0[3-6]|10)))30)|((\+(0[58]|12))45))$))|((^[0-9]{4}-(0[13-9]|1[0-2])-((0[1-9]|[12][0-9]|30))T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$)|(^[0-9]{4}-(0[13578]|1[02])-31T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$)|(^[0-9]{4}-02-(0[1-9]|1[0-9]|2[0-8])T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))-02-29T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$)|(^(([02468][048])|([13579][26]))00-02-29T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$))|((^[0-9]{4}(0[13-9]|1[0-2])((0[1-9]|[12][0-9]|30))T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$)|(^[0-9]{4}(0[13578]|1[02])31T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$)|(^[0-9]{4}02(0[1-9]|1[0-9]|2[0-8])T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))0229T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$)|(^(([02468][048])|([13579][26]))000229T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9])?((\.|,)[0-9]+)?((-(0[1-9]|1[0-2]))|(\+(0[0-9]|1[0-4])))$))' let $messages := (for $record in $records let $rid := $record/gmd:fileIdentifier/*/text() let $thesauri := if ($record/gmd:hierarchyLevel/gmd:MD_ScopeCode/@codeListValue = 'service') then $record/gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:descriptiveKeywords/gmd:MD_Keywords/gmd:thesaurusName else $record/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:descriptiveKeywords/gmd:MD_Keywords/gmd:thesaurusName return if(not($thesauri)) then () else for $thesaurus in $thesauri let $title := $thesaurus/gmd:CI_Citation/gmd:title let $keywords := string-join($thesaurus/../gmd:keyword/*[1]/text(), '; ') let $date := $thesaurus/gmd:CI_Citation/gmd:date/gmd:CI_Date/gmd:date let $dateTypeCode := $thesaurus/gmd:CI_Citation/gmd:date/gmd:CI_Date/gmd:dateType/gmd:CI_DateTypeCode return if (not($title)) then local:addMessage('TR.noTitleForThesaurus', map { 'filename': local:filename($record), 'id': $rid}) else if (not(string-length($title/gco:CharacterString/text()) != 0 or string-length($title/gmx:Anchor/text()) != 0)) then local:addMessage('TR.emptyTitleForThesaurus', map { 'filename': local:filename($record), 'id': $rid}) else if (not($date)) then local:addMessage('TR.invalidDateForThesaurus2', map { 'filename': local:filename($record), 'id': $rid, 'thesaurus': $title/*/text(), 'keywords' : $keywords}) else if (not($dateTypeCode) or not($dateTypeCode/@codeListValue = ('publication', 'revision', 'creation'))) then local:addMessage('TR.invalidDateForThesaurus2', map { 'filename': local:filename($record), 'id': $rid, 'thesaurus': $title/*/text(), 'keywords' : $keywords}) else () )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

##### md common req C.16: Group Keywords by CV click to expand contents

Test that a Keywords element only contain keywords originating from the one cited controlled vocabulary, or its version.

More information: Group Keywords by CV

Status | Passed
Duration | 0.001 s
Assertion ID | EID76f901ca-c00f-11e8-a355-529269fb1459
Assertion URI | Link

Expression:let $messages := (for $record in $records let $rid := $record/gmd:fileIdentifier/*/text() let $keywords := if ($record/gmd:hierarchyLevel/gmd:MD_ScopeCode/@codeListValue = 'service') then $record/gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:descriptiveKeywords else $record/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:descriptiveKeywords let $thesaurusNameTitle := if ($record/gmd:hierarchyLevel/gmd:MD_ScopeCode/@codeListValue = 'service') then $record/gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:descriptiveKeywords/gmd:MD_Keywords/gmd:thesaurusName/gmd:CI_Citation/gmd:title else $record/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:descriptiveKeywords/gmd:MD_Keywords/gmd:thesaurusName/gmd:CI_Citation/gmd:title return if (count($thesaurusNameTitle) != count(distinct-values($thesaurusNameTitle))) then local:addMessage('TR.keywordsNotGroupedByVocabulary', map { 'filename': local:filename($record), 'id': $rid }) else () )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

##### md common req C.17: Limitations on Public Access click to expand contents

Test that information on the existence of some limitation of public access to spatial data sets and spatial data services is provided.

More information: Limitations on Public Access

Status | Passed
Duration | 0.001 s
Assertion ID | EIDf7e5c9d6-7a5c-47cc-9c95-1d4f3a5f92eb
Assertion URI | Link

Expression:let $messages := (for $record in $records let $rid := $record/gmd:fileIdentifier/*/text() let $md_legalConstraints_Limitations := for $x in $record/gmd:identificationInfo/*/gmd:resourceConstraints/gmd:MD_LegalConstraints where (count($x/gmd:accessConstraints) != 0) let $validAccessConstraints := for $ac in $x/gmd:accessConstraints where ($ac/gmd:MD_RestrictionCode/@codeListValue = 'otherRestrictions') return $ac let $otherConstraintsAnchor := for $oc in $x/gmd:otherConstraints where (exists($oc/gmx:Anchor)) return $oc/gmx:Anchor let $validAnchor := for $y in $otherConstraintsAnchor where (starts-with($y/@xlink:href, 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess')) return if ($y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1a' or $y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1b' or $y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1c' or $y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1d' or $y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1e' or $y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1f' or $y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1g' or $y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1h' or $y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/noLimitations') then $y else () let $invalidLimitationsAnchor := for $y in $otherConstraintsAnchor where (starts-with($y/@xlink:href, 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess')) return if (not($y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1a') and not($y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1b') and not($y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1c') and not($y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1d') and not($y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1e') and not($y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1f') and not($y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1g') and not($y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1h') and not($y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/noLimitations')) then $y else() let $invalidAnchor := for $y in $otherConstraintsAnchor where ($y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/ConditionsApplyingToAccessAndUse/noConditionsApply' or $y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/ConditionsApplyingToAccessAndUse/conditionsUnknown') return $y return if(count($validAnchor) >= 1 and count($validAccessConstraints) = 1 and count($invalidAnchor) = 0 and count($invalidLimitationsAnchor) = 0) then $x else () let $invalidURI := for $iu in $record/gmd:identificationInfo/*/gmd:resourceConstraints/gmd:MD_LegalConstraints/gmd:otherConstraints/gmx:Anchor where (starts-with($iu/@xlink:href, 'https://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess')) return $iu return if(count($invalidURI) != 0) then local:addMessage('TR.invalidHttpsUri', map { 'filename': local:filename($record), 'id': $rid, 'type': 'LimitationsOnPublicAccess'}) else if (count($md_legalConstraints_Limitations) = 0) then local:addMessage('TR.noResourceLimitations', map { 'filename': local:filename($record), 'id': $rid }) else if (count($md_legalConstraints_Limitations) != 1) then local:addMessage('TR.noValidResourceLimitations', map { 'filename': local:filename($record), 'id': $rid }) else () )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

##### md common req C.18: Conditions for Access and Use click to expand contents

Test the technical restrictions of access and use of spatial data sets and services.

More information: Conditions for Access and Use

Status | Passed
Duration | 0.001 s
Assertion ID | EID410b57a6-0314-4506-9352-19042f1723cd
Assertion URI | Link

Expression:let $messages := (for $record in $records let $rid := $record/gmd:fileIdentifier/*/text() let $md_legalConstraints_Limitations := for $x in $record/gmd:identificationInfo/*/gmd:resourceConstraints/gmd:MD_LegalConstraints where (count($x/gmd:accessConstraints) != 0) let $validAccessConstraints := for $ac in $x/gmd:accessConstraints where ($ac/gmd:MD_RestrictionCode/@codeListValue = 'otherRestrictions') return $ac let $otherConstraintsAnchor := for $oc in $x/gmd:otherConstraints where (exists($oc/gmx:Anchor)) return $oc/gmx:Anchor let $validAnchor := for $y in $otherConstraintsAnchor where (starts-with($y/@xlink:href, 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess')) return if($y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1a' or $y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1b' or $y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1c' or $y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1d' or $y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1e' or $y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1f' or $y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1g' or $y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1h' or $y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/noLimitations') then $y else () let $invalidAnchor := for $y in $otherConstraintsAnchor where ($y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/ConditionsApplyingToAccessAndUse/noConditionsApply' or $y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/ConditionsApplyingToAccessAndUse/conditionsUnknown') return $y return if(count($validAnchor) >= 1 and count($validAccessConstraints) = 1) then $x else () let $md_legalConstraints_Conditions := for $x in $record/gmd:identificationInfo/*/gmd:resourceConstraints/gmd:MD_LegalConstraints let $validAccessConstraints := for $ac in $x/gmd:accessConstraints where ($ac/gmd:MD_RestrictionCode/@codeListValue = 'otherRestrictions') return $ac let $validUseConstraints := for $uc in $x/gmd:useConstraints where ($uc/gmd:MD_RestrictionCode/@codeListValue = 'otherRestrictions') return $uc let $otherConstraintsAnchor := for $oc in $x/gmd:otherConstraints where (exists($oc/gmx:Anchor)) return $oc/gmx:Anchor let $validAnchor := for $y in $otherConstraintsAnchor where ($y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/ConditionsApplyingToAccessAndUse/noConditionsApply' or $y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/ConditionsApplyingToAccessAndUse/conditionsUnknown') return $y let $invalidConditionsAnchor := for $y in $otherConstraintsAnchor where (starts-with($y/@xlink:href, 'http://inspire.ec.europa.eu/metadata-codelist/ConditionsApplyingToAccessAndUse')) return if (not($y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/ConditionsApplyingToAccessAndUse/noConditionsApply') and not($y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/ConditionsApplyingToAccessAndUse/conditionsUnknown')) then $y else() let $limitationAnchor := for $y in $otherConstraintsAnchor where (starts-with($y/@xlink:href, 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess')) return if ($y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1a' or $y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1b' or $y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1c' or $y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1d' or $y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1e' or $y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1f' or $y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1g' or $y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1h' or $y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/noLimitations') then $y else () let $validCharacterString := for $oc in $x/gmd:otherConstraints/gco:CharacterString where (not(string-length($oc) = 0)) return $oc let $validAnchorText := for $oc in $x/gmd:otherConstraints/gmx:Anchor return if (not(string-length($oc) = 0)) then $oc else if(string-length($oc) = 0 and count($validAnchor)=1) then $oc else() return if(count($validAccessConstraints) = 1 and (count($validAnchor) = 1 and (not(count($validCharacterString) = 0)))) then $x else if(count($validAccessConstraints) = 1 and (not(count($validCharacterString) = 0) or (not(count($validAnchorText) = 0) and count($invalidConditionsAnchor) = 0 and count($limitationAnchor) = 0))) then $x else if(count($validUseConstraints) = 1 and (count($validAnchor) = 1 or not(count($validCharacterString) = 0))) then $x else if(count($validUseConstraints) = 1 and (not(count($validCharacterString) = 0) or (not(count($validAnchorText) = 0) and count($invalidConditionsAnchor) = 0 and count($limitationAnchor) = 0))) then $x else () let $conditionsConstraint := for $x in $record/gmd:identificationInfo/*/gmd:resourceConstraints/gmd:MD_LegalConstraints let $otherConstraintsAnchor := for $oc in $x/gmd:otherConstraints where (exists($oc/gmx:Anchor)) return $oc/gmx:Anchor let $validAnchor := for $y in $otherConstraintsAnchor where ($y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/ConditionsApplyingToAccessAndUse/noConditionsApply' or $y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/ConditionsApplyingToAccessAndUse/conditionsUnknown') return $y let $limitationAnchor := for $y in $otherConstraintsAnchor where (starts-with($y/@xlink:href, 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess')) return if ($y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1a' or $y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1b' or $y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1c' or $y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1d' or $y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1e' or $y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1f' or $y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1g' or $y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/INSPIRE_Directive_Article13_1h' or $y/@xlink:href = 'http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/noLimitations') then $y else () return if(count($validAnchor) = 1 and count($limitationAnchor) = 0) then $x else () let $validAccessCodelist := for $cc in $conditionsConstraint where ($cc/gmd:MD_RestrictionCode/@codeListValue = 'otherRestrictions') return $cc let $validUseConstraintsCodelist := for $cc in $conditionsConstraint where ($cc/gmd:MD_RestrictionCode/@codeListValue = 'otherRestrictions') return $cc let $invalidURI := for $iu in $record/gmd:identificationInfo/*/gmd:resourceConstraints/gmd:MD_LegalConstraints/gmd:otherConstraints/gmx:Anchor where (starts-with($iu/@xlink:href, 'https://inspire.ec.europa.eu/metadata-codelist/ConditionsApplyingToAccessAndUse')) return $iu return if(count($invalidURI) != 0) then local:addMessage('TR.invalidHttpsUri', map { 'filename': local:filename($record), 'id': $rid, 'type': 'ConditionsApplyingToAccessAndUse' }) else if(count($md_legalConstraints_Conditions) = 0 and count($conditionsConstraint) > 0 and count($validAccessCodelist) = 0 and count($validUseConstraintsCodelist) = 0) then local:addMessage('TR.noValidOtherRestrictionsCodelistValue', map { 'filename': local:filename($record), 'id': $rid, 'invalidElement': string($conditionsConstraint[1]/*/gmd:MD_RestrictionCode/@codeListValue) }) else if(count($md_legalConstraints_Conditions) = 0) then local:addMessage('TR.noResourceConditions', map { 'filename': local:filename($record), 'id': $rid }) else if (count($md_legalConstraints_Conditions) != 1) then if (not(count($md_legalConstraints_Limitations) = 0 or count($md_legalConstraints_Limitations) = 1) and count($md_legalConstraints_Conditions) = 2) then local:addMessage('TR.noValidResourceConditions', map { 'filename': local:filename($record), 'id': $rid }) else () else () )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

##### md common req C.19: Geographical Bounding Box click to expand contents

Test that the extent of the resource in the geographic space is specified using a geometric bounding box.

More information: Bounding Box

Status | Passed
Duration | 0.001 s
Assertion ID | EID701be21b-1158-4055-9594-67a4e2005e38
Assertion URI | Link

Expression:let $messages := for $record in $records let $rid := $record/gmd:fileIdentifier/*/text() let $extents := if ($record/gmd:hierarchyLevel/gmd:MD_ScopeCode/@codeListValue = 'service') then $record/gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:extent/gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicBoundingBox else $record/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicBoundingBox let $regex := '^-?\d+\.\d{2,}' let $rid := $record/gmd:fileIdentifier/*/text() return (if (($record/gmd:hierarchyLevel/gmd:MD_ScopeCode/@codeListValue = 'dataset' or $record/gmd:hierarchyLevel/gmd:MD_ScopeCode/@codeListValue = 'series') and not($extents)) then local:addMessage('TR.noGeographicBoundingBox', map { 'filename': local:filename($record), 'id': $rid }) else ( for $extent in $extents let $west := $extent/gmd:westBoundLongitude/gco:Decimal/text() let $east := $extent/gmd:eastBoundLongitude/gco:Decimal/text() let $south := $extent/gmd:southBoundLatitude/gco:Decimal/text() let $north := $extent/gmd:northBoundLatitude/gco:Decimal/text() return if (not(($west and matches($west,$regex) and fn:number($west) >= -180 and fn:number($west) <= 180) and ($east and matches($east,$regex) and fn:number($east) >= -180 and fn:number($east) <= 180) and ($south and matches($south,$regex) and fn:number($south) >= -90 and fn:number($south) <= 90) and ($north and matches($north,$regex) and fn:number($north) >= -90 and fn:number($north) <= 90) and (fn:number($south) <= fn:number($north)))) then local:addMessage('TR.invalidGeographicBoundingBox', map { 'filename': local:filename($record), 'id': $rid, 'west': $west, 'east': $east, 'south': $south, 'north': $north }) else () ) )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

### Data quality
3
click to expand contents

Execute tests that apply for all metadata records on elements that are child elements of the section of the XML document: Data Quality Information (property of the gmd:MD_Metadata element). This section contains information specific to the quality and lineage (including processing steps and sources) of the resource.

Status | Passed
Duration | 0.015 s
Test case ID | EID61e803d0-c181-11e8-a355-529269fb1459

##### md common req C.20: Dataset Conformity click to expand contents

Test that the metadata includes information on the degree of conformity with the implementing rules on interoperability of spatial data sets.

More information: Dataset Conformity

Status | Passed
Duration | 0.001 s
Assertion ID | EIDf55f2448-c4d5-4af0-a83b-40ccd0d2a7df
Assertion URI | Link

Expression:let $levels := ('dataset', 'series', 'service') let $recordsToInspect := $records[gmd:hierarchyLevel/*/@codeListValue = $levels] let $messages := (for $record in $recordsToInspect let $rid := $record/gmd:fileIdentifier/*/text() let $confResult := $record/gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:report/gmd:DQ_DomainConsistency/gmd:result/gmd:DQ_ConformanceResult return if (not($confResult)) then local:addMessage('TR.noConformityStatement', map { 'filename': local:filename($record), 'id': $rid }) else () )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

##### md common req C.21: Dataset Conformity Specifications click to expand contents

Test that the DQ_ConformanceResult element is correctly specified through a citation of the INSPIRE Implementing Rule and a specification document or Conformance Class using CI_Citation element: including its official title and the date of publication of the document.

More information: Dataset Conformity Specifications

Status | Passed
Duration | 0.015 s
Assertion ID | EID1f9ddbc5-679b-44b0-bd6f-db14c9c348a9
Assertion URI | Link

Expression:let $regexDate := '(^([0-9]{2})$)|(^([0-9]{4})$)|(^([0-9]{4})-(1[0-2]|0[1-9])$)|((^[0-9]{4}-(0[13-9]|1[0-2])-(0[1-9]|[12][0-9]|30)$)|(^[0-9]{4}-(0[13578]|1[02])-31$)|(^[0-9]{4}-02-(0[1-9]|1[0-9]|2[0-8])$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))-02-29$)|(^(([02468][048])|([13579][26]))00-02-29$))|((^[0-9]{4}(0[13-9]|1[0-2])(0[1-9]|[12][0-9]|30)$)|(^[0-9]{4}(0[13578]|1[02])31$)|(^[0-9]{4}02(0[1-9]|1[0-9]|2[0-8])$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))0229$)|(^(([02468][048])|([13579][26]))000229$))|((^[0-9]{4}-(00[1-9]|0[1-9][0-9]|[12][0-9]{2}|3[0-5][0-9]|36[0-5])$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))-366$)|(^(([02468][048])|([13579][26]))00-366$))|((^[0-9]{4}(00[1-9]|0[1-9][0-9]|[12][0-9]{2}|3[0-5][0-9]|36[0-5])$)|(^[0-9]{2}(([2468][048])|([13579][26])|(0[48]))366$)|(^(([02468][048])|([13579][26]))00366$))|(^[0-9]{4}-W(0[1-9]|[1-4][0-9]|5[0-2])$)|((^(([02468][048])|([13579][26]))(04|09|15|20|26|32|37|43|48|54|60|65|71|76|82|88|93|99)-W53$)|(^(([02468][159])|([13579][37]))(05|11|16|22|28|33|39|44|50|56|61|67|72|78|84|89|95)-W53$)|(^(([02468][26])|([13579][048]))(01|07|12|18|24|29|35|40|46|52|57|63|68|71|80|85|91|96)-W53$)|(^(([02468][37])|([13579][159]))(03|08|14|20|25|31|36|42|48|53|59|64|70|76|81|87|92|98)-W53$))|((^[0-9]{4}W(0[1-9]|[1-4][0-9]|5[0-2])$))|((^(([02468][048])|([13579][26]))(04|09|15|20|26|32|37|43|48|54|60|65|71|76|82|88|93|99)W53$)|(^(([02468][159])|([13579][37]))(05|11|16|22|28|33|39|44|50|56|61|67|72|78|84|89|95)W53$)|(^(([02468][26])|([13579][048]))(01|07|12|18|24|29|35|40|46|52|57|63|68|71|80|85|91|96)W53$)|(^(([02468][37])|([13579][159]))(03|08|14|20|25|31|36|42|48|53|59|64|70|76|81|87|92|98)W53$))|(^[0-9]{4}-W(0[1-9]|[1-4][0-9]|5[0-2])-[1-7]$)|((^(([02468][048])|([13579][26]))(04|09|15|20|26|32|37|43|48|54|60|65|71|76|82|88|93|99)-W53-[1-7]$)|(^(([02468][159])|([13579][37]))(05|11|16|22|28|33|39|44|50|56|61|67|72|78|84|89|95)-W53-[1-7]$)|(^(([02468][26])|([13579][048]))(01|07|12|18|24|29|35|40|46|52|57|63|68|71|80|85|91|96)-W53-[1-7]$)|(^(([02468][37])|([13579][159]))(03|08|14|20|25|31|36|42|48|53|59|64|70|76|81|87|92|98)-W53-[1-7]$))|(^[0-9]{4}W(0[1-9]|[1-4][0-9]|5[0-2])[1-7]$)|((^(([02468][048])|([13579][26]))(04|09|15|20|26|32|37|43|48|54|60|65|71|76|82|88|93|99)W53[1-7]$)|(^(([02468][159])|([13579][37]))(05|11|16|22|28|33|39|44|50|56|61|67|72|78|84|89|95)W53[1-7]$)|(^(([02468][26])|([13579][048]))(01|07|12|18|24|29|35|40|46|52|57|63|68|71|80|85|91|96)W53[1-7]$)|(^(([02468][37])|([13579][159]))(03|08|14|20|25|31|36|42|48|53|59|64|70|76|81|87|92|98)W53[1-7]$))' let $levels := ('dataset', 'series', 'service') let $recordsToInspect := $records[gmd:hierarchyLevel/*/@codeListValue = $levels] let $messages := (for $record in $recordsToInspect let $rid := $record/gmd:fileIdentifier/*/text() let $result := $record/gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:report/gmd:DQ_DomainConsistency/gmd:result/gmd:DQ_ConformanceResult return if (not($result)) then local:addMessage('TR.noConformityStatement', map { 'filename': local:filename($record), 'id': $rid }) else if (not($result/gmd:specification/gmd:CI_Citation)) then local:addMessage('TR.missingCitationSection', map { 'filename': local:filename($record), 'id': $rid }) else (for $res in $result return if((contains($res/gmd:specification/gmd:CI_Citation/gmd:title/*/text(), '1089/2010') and ($record/gmd:hierarchyLevel/*/@codeListValue = ('dataset') or ($record/gmd:hierarchyLevel/*/@codeListValue = ('service') and $record/gmd:identificationInfo/srv:SV_ServiceIdentification/srv:serviceType/*/text() = "other"))) or (contains($res/gmd:specification/gmd:CI_Citation/gmd:title/*/text(), '976/2009') and $record/gmd:hierarchyLevel/*/@codeListValue = ('service'))) then let $aaa := 'aaa' return if(not($res/gmd:specification/gmd:CI_Citation)) then local:addMessage('TR.noCitationForSpecification', map { 'filename': local:filename($record), 'id': $rid }) else for $citation in $res/gmd:specification/gmd:CI_Citation let $title := $citation/gmd:title let $date := $citation/gmd:date let $dateTypeCode := $citation/gmd:date/gmd:CI_Date/gmd:dateType/gmd:CI_DateTypeCode return if (not($title) or not(string-length($title/gco:CharacterString) != 0 or string-length($title/gmx:Anchor) != 0)) then local:addMessage('TR.noTitleForSpecification', map { 'filename': local:filename($record), 'id': $rid }) else if ($title/gmd:PT_FreeText) then for $localisedCharacterString in $title/gmd:PT_FreeText/gmd:textGroup/gmd:LocalisedCharacterString return if (string-length($localisedCharacterString) = 0) then local:addMessage('TR.emptyFreeText', map{'filename': local:filename($record), 'id': $rid, 'path': '/gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:report/gmd:DQ_DomainConsistency/gmd:result/gmd:DQ_ConformanceResult/gmd:specification/gmd:CI_Citation/$citation/gmd:title/gmd:PT_FreeText'}) else () else if (not($date)) then local:addMessage('TR.noDateTypeForSpecification', map { 'filename': local:filename($record), 'id': $rid }) else if (not($dateTypeCode)) then local:addMessage('TR.noDateTypeForSpecification', map { 'filename': local:filename($record), 'id': $rid }) else if (not($dateTypeCode/@codeListValue = ('publication', 'creation', 'revision'))) then local:addMessage('TR.noDateTypeForSpecification', map { 'filename': local:filename($record), 'id': $rid }) else if (exists($date/gmd:CI_Date/gmd:date/gco:Date/text())) then let $dummy := "aaa" for $dat in $date/gmd:CI_Date/gmd:date/gco:Date/text() return if (not(matches($dat, $regexDate))) then local:addMessage('TR.invalidDateFormat', map { 'filename': local:filename($record), 'id': $rid}) else () else() else ()) )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

##### md common req C.22: Conformity Degree click to expand contents

Test that each Conformance Result includes the degree of declared conformity against this specification using a property with value "true" for a conformant resource and "false" for non-conformant resource.

More information: Conformity Degree

Status | Passed
Duration | 0.001 s
Assertion ID | EID614cd750-a8a2-4256-908c-e452c2b4e506
Assertion URI | Link

Expression:let $messages := (for $record in $records let $rid := $record/gmd:fileIdentifier/*/text() let $result := $record/gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:report/gmd:DQ_DomainConsistency/gmd:result/gmd:DQ_ConformanceResult return if (not($result)) then local:addMessage('TR.noConformityStatement', map { 'filename': local:filename($record), 'id': $rid }) else (for $res in $result return if((contains($res/gmd:specification/gmd:CI_Citation/gmd:title/*/text(), '1089/2010') and ($record/gmd:hierarchyLevel/*/@codeListValue = ('dataset') or ($record/gmd:hierarchyLevel/*/@codeListValue = ('service') and $record/gmd:identificationInfo/srv:SV_ServiceIdentification/srv:serviceType/*/text() = "other"))) or (contains($res/gmd:specification/gmd:CI_Citation/gmd:title/*/text(), '976/2009') and $record/gmd:hierarchyLevel/*/@codeListValue = ('service'))) then let $pass := $res/gmd:pass return if ($pass) then if($pass/gco:Boolean) then if (not($pass/gco:Boolean/text() = 'true' or $pass/gco:Boolean/text() = 'false')) then local:addMessage('TR.declareNoConformityEvaluationAsUnknown', map { 'filename': local:filename($record), 'id': $rid }) else () else if (not($pass/@gco:nilReason)) then local:addMessage('TR.declareNoConformityEvaluationAsUnknown', map { 'filename': local:filename($record), 'id': $rid }) else if (not($pass/@gco:nilReason = 'unknown')) then local:addMessage('TR.declareNoConformityEvaluationAsUnknown', map { 'filename': local:filename($record), 'id': $rid }) else () else local:addMessage('TR.declareNoConformityEvaluationAsUnknown', map { 'filename': local:filename($record), 'id': $rid }) else()) )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

## Conformance Class 1: INSPIRE data sets and data set series baseline metadata.
3

Please report any issues or problems in GitHub.
Known limitations are documented in the description of the applicable test case or test assertion.
There is a general limitation in all assertions that polymorphism and containment by reference (see the Technical Guidance, sub-clauses A.3, A.4 and A.5) are not supported. However, the current Abstract Test Suite does not support polymorphism and references either (all XPath expressions do not support polymorhism or references; in addition, schema validation is only executed against the ISO/OGC schemas without extensions). It is therefore unclear if this is really a limitation or if the sections in the technical guidance are outdated.
Source: Conformance Class 1: 'Baseline metadata for data sets and data set series'
Pre-requisite conformance classes: Common Requirements

Status | Passed
Duration | 0.685 s
Test suite ID | EIDe4a95862-9cc9-436b-9fdd-a0115d342350
Author | Consortium Bilbomatica, Guadaltel y Geograma
Date created | 30/06/2018 00:00:00 GMT
Version | 1.0.6
Last editor | Consortium Bilbomatica, Guadaltel y Geograma
Last updated | 21/02/2022 13:00:00 GMT
Reference | Link
Hash | CBF29CE484222325

### General Metadata
1
click to expand contents

Execute tests that apply for all dataset / dataset series metadata records on elements that are directly child elements of the root node of the XML document: MD_Metadata node.

Status | Passed
Duration | 0.001 s
Test case ID | EIDf6fb6d58-03ec-432f-a456-984d093721e4

##### md datasets-and-series 1.1: Resource Type click to expand contents

Test that a resource type is provided as a dataset or series.

More information: Resource Type

Status | Passed
Duration | 0.001 s
Assertion ID | EID9f5d8bbf-59d3-4278-82d3-c9df32d8f42d
Assertion URI | Link

Expression:let $values := ('dataset', 'series') let $recordsWithErrors := $records[not(gmd:hierarchyLevel/gmd:MD_ScopeCode/@codeListValue = $values)][position() le $limitErrors] return (if ($recordsWithErrors) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count($recordsWithErrors)), for $record in $recordsWithErrors let $rid := $record/gmd:fileIdentifier/gco:CharacterString/text() order by $rid let $levels := $record/gmd:hierarchyLevel/gmd:MD_ScopeCode/@codeListValue return local:addMessage('TR.hierarchyLevel', map { 'filename': local:filename($record), 'id': $rid, 'hierarchyLevels': fn:string-join($levels,', ') }) )

### Identification
6
click to expand contents

Execute tests that apply for all dataset / dataset series metadata records on elements that are child elements of the section of the XML document: Identification Info (property of the gmd:MD_Metadata element). This section contains information specific to the dataset / dataset series.

Status | Passed
Duration | 0.613 s
Test case ID | EID979c19da-48f9-416d-b751-37ef13912bc6

##### md datasets-and-series 1.2: Only One Data Identification click to expand contents

Test that the identification info section of the metadata for data sets and data set series is provided correctly.

More information: Only One Data Identification

Status | Passed
Duration | 0.001 s
Assertion ID | EIDfeb08775-3d07-4849-bd27-3a549c92d289
Assertion URI | Link

Expression:let $messages := ( for $record in $records let $rid := $record/gmd:fileIdentifier/gco:CharacterString/text() return if(count($record/gmd:identificationInfo[1]/gmd:MD_DataIdentification) != 1) then local:addMessage('TR.identificationInfo', map { 'filename': local:filename($record), 'id': $rid, 'identificationInfo': fn:string-join($record/gmd:identificationInfo[1]/gmd:MD_DataIdentification,', ') }) else () )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

##### md datasets-and-series 1.3: Dataset UID click to expand contents

Test that every dataset or dataset series has an Unique Resource Identifier.

More information: Dataset UID

Status | Passed
Duration | 0.001 s
Assertion ID | EID06911d33-b5a3-4b76-b8ee-d473ebf3c8f4
Assertion URI | Link

Expression:let $levels := ('dataset', 'series') let $allIdent := for $rec in $records for $x in $rec/gmd:identificationInfo[1]/*/gmd:citation/gmd:CI_Citation/gmd:identifier/*/gmd:code/* return if($x/node-name() = QName('http://www.isotc211.org/2005/gco','gco:CharacterString')) then $x/text() else if ($x/node-name() = QName('http://www.isotc211.org/2005/gmx','gmx:Anchor')) then $x/@xlink:href else () let $distinctRecordIdentifiers := distinct-values($allIdent) let $duplicateDistinctRecordIdentifiers := $distinctRecordIdentifiers[index-of($distinctRecordIdentifiers,.)[2]] let $messages := (for $record in $records let $rid := $record/gmd:fileIdentifier/gco:CharacterString/text() let $identifiers := $record/gmd:identificationInfo[1]/*/gmd:citation/gmd:CI_Citation/gmd:identifier/*/gmd:code let $duplicateIdentifier := for $id in $identifiers return if (count(fn:index-of($allIdent,$id)) > 1) then $id else () return let $emptyIdentifiers := for $identifier in $identifiers return if (not($identifier)) then $identifier else if ($identifier/gco:CharacterString and not(string-length($identifier/gco:CharacterString/text()) != 0)) then $identifier else if ($identifier/gmx:Anchor and string-length($identifier/gmx:Anchor/@xlink:href) = 0) then $identifier else () return if (not($identifiers)) then local:addMessage('TR.noIdentifier', map { 'filename': local:filename($record), 'id': $rid }) else if(count($emptyIdentifiers) != 0) then local:addMessage('TR.emptyIdentifier', map { 'filename': local:filename($record), 'id': $rid }) else if(count($duplicateIdentifier)) then local:addMessage('TR.duplicateIdentifier', map { 'filename': local:filename($record), 'id': $rid, 'identifier': fn:string-join(distinct-values($duplicateIdentifier),'; ') }) else () )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

##### md datasets-and-series 1.4: INSPIRE Theme Keyword click to expand contents

Test that the INSPIRE Data Themes, which the data belongs to, are declared using at least one keyword from the INSPIRE Spatial Data Themes vocabulary.

More information: INSPIRE Theme Keyword

Status | Passed
Duration | 0.612 s
Assertion ID | EID84892cf0-e7db-4705-9b40-c27a856eacee
Assertion URI | Link

Expression:let $levels := ('dataset', 'series') let $THEMES_TITLE := 'GEMET - INSPIRE themes, version 1.0' let $messages := (try{ let $officialLanguages := ('bg','cs','da','de','et','el','en','es','fr','hr','it','lv','lt','hu','mt','nl','pl','pt','ro','sk','sl','fi','sv') let $inspireThemesCodeListURL := 'http://inspire.ec.europa.eu/theme' let $codeTitles := local:get-code-titles($inspireThemesCodeListURL,$officialLanguages) let $codeValues := local:get-code-list-values($inspireThemesCodeListURL) let $codes := ($codeTitles,$codeValues) for $record in $records let $rid := $record/gmd:fileIdentifier/*/text() let $relevantDescriptiveKeywordsBlocks := $record/gmd:identificationInfo[1]/gmd:MD_DataIdentification/gmd:descriptiveKeywords/gmd:MD_Keywords[gmd:thesaurusName/gmd:CI_Citation/gmd:title/*/text() = $THEMES_TITLE] return if (count($relevantDescriptiveKeywordsBlocks) = 0) then local:addMessage('TR.wrongKeywordFromINSPIREThemesTitle', map { 'filename': local:filename($record), 'id': $rid }) else if ($relevantDescriptiveKeywordsBlocks[not(some $keyword in ./gmd:keyword/*/text() satisfies $keyword = $codes) ]) then local:addMessage('TR.noKeywordFromINSPIREThemes', map { 'filename': local:filename($record), 'id': $rid, 'url': $inspireThemesCodeListURL, 'keywords': fn:string-join($relevantDescriptiveKeywordsBlocks/gmd:keyword/*/text(),'; ') }) else () } catch * { local:addMessage('TR.systemError', map { 'text': $err:description }) } )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

##### md datasets-and-series 1.5: Spatial Resolution click to expand contents

Test that the spatial resolution is defined using either an scale or a distance resolution.

More information: Spatial Resolution

Status | Passed
Duration | 0.001 s
Assertion ID | EID82a0442f-0185-4d6a-9b4e-0b7356613de7
Assertion URI | Link

Expression:let $regex_integer := '(^\d{1,40}$)' let $messages := (for $record in $records let $countResolutions := count($record/gmd:identificationInfo[1]/*/gmd:spatialResolution) let $countScale := count($record/gmd:identificationInfo[1]/*/gmd:spatialResolution/gmd:MD_Resolution/gmd:equivalentScale) let $countDistance := count($record/gmd:identificationInfo[1]/*/gmd:spatialResolution/gmd:MD_Resolution/gmd:distance) let $invalidScale := for $x in $record/gmd:identificationInfo[1]/*/gmd:spatialResolution/gmd:MD_Resolution/gmd:equivalentScale/gmd:MD_RepresentativeFraction/gmd:denominator/gco:Integer return if(matches($x/text(), $regex_integer)) then () else $x let $invalidDistance := for $x in $record/gmd:identificationInfo[1]/*/gmd:spatialResolution/gmd:MD_Resolution/gmd:distance/gco:Distance return try { if(xs:double($x/text())) then () else $x }catch err:FORG0001 { $x } let $rid := $record/gmd:fileIdentifier/*/text() return if (($countResolutions > 0) and ($countScale = 0) and ($countDistance = 0)) then local:addMessage('TR.noResolutions', map { 'filename': local:filename($record), 'id': $rid }) else if(count($invalidScale) != 0) then local:addMessage('TR.invalidScale', map { 'filename': local:filename($record), 'id': $rid, 'invalid': fn:string-join($invalidScale,'; ')}) else if(count($invalidDistance) != 0) then local:addMessage('TR.invalidDistance', map { 'filename': local:filename($record), 'id': $rid, 'invalid': fn:string-join($invalidDistance,'; ')}) else for $spatialResolution in $record/gmd:identificationInfo[1]/*/gmd:spatialResolution return if (count($spatialResolution/gmd:MD_Resolution/gmd:equivalentScale) > 0 and count($spatialResolution/gmd:MD_Resolution/gmd:distance) > 0) then local:addMessage('TR.mixedResolutions', map { 'filename': local:filename($record), 'id': $rid }) else () )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

##### md datasets-and-series 1.6: Resource Language click to expand contents

Test that a resource language is provided.

More information: Resource Language

Status | Passed
Duration | 0.001 s
Assertion ID | EID095d416e-3dfe-4936-83d4-71028e3d0c4c
Assertion URI | Link

Expression:let $codes := ('aar','abk','ace','ach','ada','ady','afa','afh','afr','ain','aka','akk','alb','ale','alg','alt','amh','ang','anp','apa','ara','arc','arg','arm','arn','arp','art','arw','asm','ast','ath','aus','ava','ave','awa','aym','aze','bad','bai','bak','bal','bam','ban','baq','bas','bat','bej','bel','bem','ben','ber','bho','bih','bik','bin','bis','bla','bnt','bos','bra','bre','btk','bua','bug','bul','bur','byn','cad','cai','car','cat','cau','ceb','cel','cha','chb','che','chg','chi','chk','chm','chn','cho','chp','chr','chu','chv','chy','cmc','cop','cor','cos','cpe','cpf','cpp','cre','crh','crp','csb','cus','cze','dak','dan','dar','day','del','den','dgr','din','div','doi','dra','dsb','dua','dum','dut','dyu','dzo','efi','egy','eka','elx','eng','enm','epo','est','ewe','ewo','fan','fao','fat','fij','fil','fin','fiu','fon','fre','frm','fro','frr','frs','fry','ful','fur','gaa','gay','gba','gem','geo','ger','gez','gil','gla','gle','glg','glv','gmh','goh','gon','gor','got','grb','grc','gre','grn','gsw','guj','gwi','hai','hat','hau','haw','heb','her','hil','him','hin','hit','hmn','hmo','hrv','hsb','hun','hup','iba','ibo','ice','ido','iii','ijo','iku','ile','ilo','ina','inc','ind','ine','inh','ipk','ira','iro','ita','jav','jbo','jpn','jpr','jrb','kaa','kab','kac','kal','kam','kan','kar','kas','kau','kaw','kaz','kbd','kha','khi','khm','kho','kik','kin','kir','kmb','kok','kom','kon','kor','kos','kpe','krc','krl','kro','kru','kua','kum','kur','kut','lad','lah','lam','lao','lat','lav','lez','lim','lin','lit','lol','loz','ltz','lua','lub','lug','lui','lun','luo','lus','mac','mad','mag','mah','mai','mak','mal','man','mao','map','mar','mas','may','mdf','mdr','men','mga','mic','min','mis','mkh','mlg','mlt','mnc','mni','mno','moh','mon','mos','mul','mun','mus','mwl','mwr','myn','myv','nah','nai','nap','nau','nav','nbl','nde','ndo','nds','nep','new','nia','nia','nic','niu','nno','nob','nog','non','nor','nqo','nso','nub','nwc','nya','nym','nyn','nyo','nzi','oci','oji','ori','orm','osa','oss','ota','oto','paa','pag','pal','pam','pan','pap','pau','peo','per','phi','phn','pli','pol','pon','por','pra','pro','pus','qaa-qtz','que','raj','rap','rar','roa','roh','rom','rum','run','rup','rus','sad','sag','sah','sai','sal','sam','san','sas','sat','scn','sco','sel','sem','sga','sgn','shn','sid','sin','sio','sit','sla','slo','slv','sma','sme','smi','smj','smn','smo','sms','sna','snd','snk','sog','som','son','sot','spa','srd','srn','srp','srr','ssa','ssw','suk','sun','sus','sux','swa','swe','syc','syr','tah','tai','tam','tat','tel','tem','ter','tet','tgk','tgl','tha','tib','tig','tir','tiv','tkl','tlh','tli','tmh','tog','ton','tpi','tsi','tsn','tso','tuk','tum','tup','tur','tut','tvl','twi','tyv','udm','uga','uig','ukr','umb','und','urd','uzb','vai','ven','vie','vol','vot','wak','wal','war','was','wel','wen','wln','wol','xal','xho','yao','yap','yid','yor','ypk','zap','zbl','zen','zha','znd','zul','zun','zxx','zza') let $messages := (for $record in $records let $rid := $record/gmd:fileIdentifier/*/text() let $languageCodes := $record/gmd:identificationInfo[1]/*/gmd:language/gmd:LanguageCode return if (not($languageCodes)) then local:addMessage('TR.noLanguageCode', map { 'filename': local:filename($record), 'id': $rid }) else let $wrongCodeValues := $languageCodes/@codeListValue[not(. = $codes)] let $wrongCodeList := $languageCodes/@codeList[not(. = 'http://www.loc.gov/standards/iso639-2/') and not(. = 'http://www.loc.gov/standards/iso639-2') and not(. = 'https://www.loc.gov/standards/iso639-2/') and not(. = 'https://www.loc.gov/standards/iso639-2') and not(. = 'http://id.loc.gov/vocabulary/iso639-2/') and not(. = 'http://id.loc.gov/vocabulary/iso639-2') and not(. = 'https://id.loc.gov/vocabulary/iso639-2/') and not(. = 'https://id.loc.gov/vocabulary/iso639-2')] return if ($wrongCodeValues) then local:addMessage('TR.invalidLanguageCode', map { 'filename': local:filename($record), 'id': $rid, 'invalidCodes' : string-join($wrongCodeValues,', ') }) else if($wrongCodeList) then local:addMessage('TR.wrongCodeList_Param', map { 'filename': local:filename($record), 'id': $rid, 'param': 'http://www.loc.gov/standards/iso639-2/ or http://id.loc.gov/vocabulary/iso639-2'}) else () )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

##### md datasets-and-series 1.7: Topic Category click to expand contents

Test that at least one Topic category describing the category of the resource is provided.

More information: Topic Category

Status | Passed
Duration | 0.001 s
Assertion ID | EIDae4bda0e-1dec-4e66-97b8-d4c43b66d2b8
Assertion URI | Link

Expression:let $codes := ('biota','boundaries','climatologyMeteorologyAtmosphere','economy','elevation','environment','farming','geoscientificInformation','health','imageryBaseMapsEarthCover','inlandWaters','intelligenceMilitary','location','oceans','planningCadastre','society','structure','transportation','utilitiesCommunication') let $messages := (for $record in $records let $rid := $record/gmd:fileIdentifier/*/text() let $topicCategories := $record/gmd:identificationInfo[1]/gmd:MD_DataIdentification/gmd:topicCategory return if (count($topicCategories) = 0) then local:addMessage('TR.noTopicCategory', map { 'filename': local:filename($record), 'id': $rid}) else for $topicCategory in $topicCategories return if(not($topicCategory/gmd:MD_TopicCategoryCode)) then local:addMessage('TR.noTopicCategory', map { 'filename': local:filename($record), 'id': $rid}) else if (not($topicCategory/gmd:MD_TopicCategoryCode = $codes)) then local:addMessage('TR.invalidTopicCode', map { 'filename': local:filename($record), 'id': $rid, 'invalidCodes' : $topicCategory/gmd:MD_TopicCategoryCode/text() }) else() )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

### Distribution
4
click to expand contents

Execute tests that apply for all dataset / dataset series metadata records on elements that are child elements of the section of the XML document: Distribution Information (property of the gmd:MD_Metadata element). This section contains information about who makes a resource available and how to get it.

Status | Passed
Duration | 0.072 s
Test case ID | EID646900b2-9564-44b9-8576-cfcab22e3419

##### md datasets-and-series 1.8: Resource Locator click to expand contents

Test if there is a resource or the url that points to a resource that provides additional information about the set data set or data set series.

More information: Resource Locator

Status | Passed
Duration | 0.001 s
Assertion ID | EID4f536f56-3118-474e-81b4-c0e36344a70b
Assertion URI | Link

Expression:let $regex_url := '(http://|https://|ftp://)([a-z0-9]{1})((\.[a-z0-9-])|([a-z0-9-]))*\.([a-z0-9-]{1,4})(/?)' let $messages := (for $record in $records let $rid := $record/gmd:fileIdentifier/*/text() return for $onLine in $record/gmd:distributionInfo/gmd:MD_Distribution/gmd:transferOptions/gmd:MD_DigitalTransferOptions/gmd:onLine/gmd:CI_OnlineResource let $url := $onLine/gmd:linkage/gmd:URL return if (not(string-length($url/text()) != 0)) then local:addMessage('TR.linkageWithoutURL', map { 'filename': local:filename($record), 'id': $rid }) else if (not(matches($url/text(), $regex_url))) then local:addMessage('TR.invalidURL', map { 'filename': local:filename($record), 'id': $rid, 'url': $url/text()}) else () )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

##### md datasets-and-series 1.9: Data Quality Info Section click to expand contents

Test that one citation of the product specification or user requirement against which data is being evaluated is provided.

More information: Data Quality Info Section

Status | Passed
Duration | 0.001 s
Assertion ID | EIDc7ef6d4f-a03b-4797-85e2-3b4a49e0c5ff
Assertion URI | Link

Expression:let $messages := (for $record in $records let $rid := $record/gmd:fileIdentifier/*/text() let $dataQuality := $record/gmd:dataQualityInfo/gmd:DQ_DataQuality let $levels := ('dataset', 'series') let $MD_ScopeCode := $record/gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:scope/gmd:DQ_Scope/gmd:level/gmd:MD_ScopeCode return if (count($dataQuality) != 1) then local:addMessage('TR.wrongNumberOfDataQuality', map { 'filename': local:filename($record), 'id': $rid }) else if (not($MD_ScopeCode/@codeListValue = $levels)) then local:addMessage('TR.invalidCodeList', map { 'filename': local:filename($record), 'id': $rid }) else () )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

##### md datasets-and-series 1.10: Dataset Conformity click to expand contents

Test that the metadata contains a citation of the implementing rules on interoperability of spatial data sets (Regulation 1089/2010).

More information: Dataset Conformity

To fulfill this requirement, the evaluated metadata dataset shall be encoded according to the following common requirements of the Technical Guide:

Common ATS (C.20): 'Dataset Conformity'

Common ATS (C.21): 'Dataset Conformity Specifications'

Common ATS (C.22): 'Conformity Degree '

Status | Passed
Duration | 0.071 s
Assertion ID | EID8f663265-32b8-4c99-8997-2d40f6ce5b93
Assertion URI | Link

Expression:let $enum_files := ('enum_bul', 'enum_cze', 'enum_dan', 'enum_dut', 'enum_eng', 'enum_est', 'enum_fin', 'enum_fre', 'enum_ger', 'enum_gle', 'enum_gre', 'enum_hun', 'enum_ita', 'enum_lav', 'enum_lit', 'enum_mlt', 'enum_pol', 'enum_por', 'enum_rum', 'enum_slo', 'enum_slv', 'enum_spa', 'enum_swe') let $conformityText := for $x in $enum_files return fn:doc(concat('http://inspire.ec.europa.eu/schemas/common/1.0/enums/', $x, '.xsd'))/xs:schema/xs:complexType[starts-with(@name, 'citationInspireInteroperabilityRegulation')]/xs:complexContent/xs:restriction[@base = 'citationConformity']/xs:sequence/xs:element[@name = 'Title']/xs:simpleType/xs:restriction/xs:enumeration/@value let $conformityTextLower := for $x in $conformityText return normalize-space(lower-case($x)) let $messages := (for $record in $records let $rid := $record/gmd:fileIdentifier/*/text() let $confResults := $record/gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:report/gmd:DQ_DomainConsistency/gmd:result/gmd:DQ_ConformanceResult let $valid := (for $confResult in $confResults return if (contains($confResult/gmd:specification/gmd:CI_Citation/gmd:title/*/text(), '1089/2010')) then let $dummy := local:log("Code list value: " || $confResult/gmd:specification/gmd:CI_Citation/gmd:title/*/text()) return if (normalize-space(lower-case($confResult/gmd:specification/gmd:CI_Citation/gmd:title/*/text())) = $conformityTextLower) then $confResult else() else()) let $invalid_dateTypeCode := (for $confResult in $confResults return if (contains($confResult/gmd:specification/gmd:CI_Citation/gmd:title/*/text(), '1089/2010')) then let $dateTypeCode := $confResult/gmd:specification/gmd:CI_Citation/gmd:date/gmd:CI_Date/gmd:dateType/gmd:CI_DateTypeCode let $dummy2 := local:log("Code list value: " || $dateTypeCode/@codeListValue) return if (not($dateTypeCode/@codeListValue = ('publication', 'creation', 'revision'))) then $dateTypeCode else() else()) return if(count($invalid_dateTypeCode) != 0) then local:addMessage('TR.noDateTypeForSpecification', map { 'filename': local:filename($record), 'id': $rid }) else if (count($valid) = 0) then local:addMessage('TR.wrongNumberOfSpecificationForPurpose', map { 'filename': local:filename($record), 'id': $rid }) else() )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

##### md datasets-and-series 1.11: Lineage click to expand contents

Test that exactly one explanation about the lineage of a dataset is provided.

More information: Lineage

Status | Passed
Duration | 0.001 s
Assertion ID | EID366b8ce9-9a73-47b8-96da-3d24166a0f3f
Assertion URI | Link

Expression:let $messages := (for $record in $records let $rid := $record/gmd:fileIdentifier/*/text() let $lineageStatement := $record/gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:lineage/gmd:LI_Lineage/gmd:statement return if (count($lineageStatement) != 1) then local:addMessage('TR.wrongNumberOfLineageStatements', map { 'filename': local:filename($record), 'id': $rid, 'count': string(count($lineageStatement)) }) else if (not($lineageStatement) or not(string-length($lineageStatement/gco:CharacterString) != 0 or string-length($lineageStatement/gmx:Anchor) != 0)) then local:addMessage('TR.emptyLineageStatement', map { 'filename': local:filename($record), 'id': $rid }) else () )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

## Conformance Class 2: INSPIRE data sets and data set series interoperability metadata.
4

This test suite examines metadata records against the requirements for metadata in INSPIRE.
Please report any issues or problems in GitHub.
Known limitations are documented in the description of the applicable test case or test assertion.
There is a general limitation in all assertions that polymorphism and containment by reference (see the Technical Guidance, sub-clauses A.3, A.4 and A.5) are not supported. However, the current Abstract Test Suite does not support polymorphism and references either (all XPath expressions do not support polymorhism or references; in addition, schema validation is only executed against the ISO/OGC schemas without extensions). It is therefore unclear if this is really a limitation or if the sections in the technical guidance are outdated.
Source: Conformance Class 2: 'INSPIRE data sets and data set series interoperability metadata'
Pre-requisite conformance classes: Conformance Class 1

Status | Passed
Duration | 0.035 s
Test suite ID | EID2be1480a-fe42-40b2-9420-eb0e69385c80
Author | Consortium Bilbomatica, Guadaltel y Geograma
Date created | 30/06/2018 00:00:00 GMT
Version | 1.0.2
Last editor | Consortium Bilbomatica y Guadaltel
Last updated | 03/05/2024 12:15:00 GMT
Reference | Link
Hash | CBF29CE484222325

### General Metadata
3
click to expand contents

Execute tests that apply for all dataset / dataset series metadata records on elements that are directly child elements of the root node of the XML document: MD_Metadata node.

Status | Passed
Duration | 0.034 s
Test case ID | EID57034804-54da-448a-ac31-6ee56b93a82b

##### md isdss 2.1: Coordinate Reference System click to expand contents

Test that the coordinate reference system identifiers are provided.

More information: Coordinate Reference System

Status | Passed
Duration | 0.001 s
Assertion ID | EID02c29a8c-874b-4fa6-b08d-75a0759d85a3
Assertion URI | Link

Expression:let $messages := (for $record in $records let $rid := $record/gmd:fileIdentifier/*/text() let $crsIdentifiers := $record/gmd:referenceSystemInfo/gmd:MD_ReferenceSystem/gmd:referenceSystemIdentifier/gmd:RS_Identifier return if (count($crsIdentifiers) = 0) then local:addMessage('TR.noCrsIdentifier', map { 'filename': local:filename($record), 'id': $rid }) else for $crs in $crsIdentifiers let $code := $crs/gmd:code let $codeSpace := $crs/gmd:codeSpace return if (not($code) or not(string-length($code/gco:CharacterString/text()) != 0 or string-length($code/gmx:Anchor/text()) != 0)) then local:addMessage('TR.noCrsCode', map { 'filename': local:filename($record), 'id': $rid}) else if ($codeSpace and not(string-length($codeSpace/gco:CharacterString/text()) != 0 or string-length($codeSpace/gmx:Anchor/text()) != 0)) then local:addMessage('TR.noCrsCodeSpace', map { 'filename': local:filename($record), 'id': $rid}) else () )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

##### md isdss 2.2: Coordinate Reference System Identifiers click to expand contents

Test that the default coordinate reference systems uses a correct identifier.

More information: Coordinate Reference System Identifiers

Status | Passed
Duration | 0.034 s
Assertion ID | EID9cc67cd3-19cf-4475-b2aa-dcbedab9f685
Assertion URI | Link

Expression:let $codelisturl := 'https://inspire.ec.europa.eu/crs/crs.en.xml' let $httpURIIdentifier:= fn:doc($codelisturl)/*:register/*:containeditems/*:crs/*:crsidentifier/@id let $messages := (for $record in $records let $rid := $record/gmd:fileIdentifier/*/text() let $crsIdentifiers := $record/gmd:referenceSystemInfo/gmd:MD_ReferenceSystem/gmd:referenceSystemIdentifier/gmd:RS_Identifier return for $crs in $crsIdentifiers let $code := $crs/gmd:code let $codeSpace := $crs/gmd:codeSpace let $defaultEpsgCode := for $x in $httpURIIdentifier return if(contains($code/gco:CharacterString/text(), $x)) then $code/gco:CharacterString else if(contains($code/gmx:Anchor/text(), $x)) then $code/gmx:Anchor/@xlink:href else () return if (not(count($defaultEpsgCode) = 0)) then if (not($code[gco:CharacterString = $httpURIIdentifier] or $code[gmx:Anchor/@xlink:href = $httpURIIdentifier])) then local:addMessage('TR.invalidCrsCode', map { 'filename': local:filename($record), 'id': $rid }) else if($codeSpace) then local:addMessage('TR.invalidCrsCode', map { 'filename': local:filename($record), 'id': $rid }) else () else () )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

##### md isdss 2.3: Temporal Reference Systems click to expand contents

Test if the temporal reference system(s) is provided correctly.

More information: Temporal Reference Systems

Status | Passed
Duration | 0.001 s
Assertion ID | EIDef8d3d22-be0f-4618-88a2-2bc0bbfc8077
Assertion URI | Link

Expression:let $messages := (for $record in $records let $rid := $record/gmd:fileIdentifier/*/text() let $crsIdentifiers := $record/gmd:referenceSystemInfo/gmd:MD_ReferenceSystem/gmd:referenceSystemIdentifier/gmd:RS_Identifier return if (not($crsIdentifiers)) then local:addMessage('TR.noCrsCode', map { 'filename': local:filename($record), 'id': $rid }) else for $crs in $crsIdentifiers let $code := $crs/gmd:code let $codeSpace := $crs/gmd:codeSpace return if (not($code) or not(string-length($code/gco:CharacterString/text()) != 0 or string-length($code/gmx:Anchor/text()) != 0)) then local:addMessage('TR.noCrsCode', map { 'filename': local:filename($record), 'id': $rid }) else if (($codeSpace) and not(string-length($codeSpace/gco:CharacterString/text()) != 0 or string-length($codeSpace/gmx:Anchor/text()) != 0)) then local:addMessage('TR.noCrsCodeSpace', map { 'filename': local:filename($record), 'id': $rid }) else () )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

### Identification
2
click to expand contents

Execute tests that apply for all dataset / dataset series metadata records on elements that are child elements of the section of the XML document: Identification Info (property of the gmd:MD_Metadata element). This section contains information specific to the dataset / dataset series.

Status | Passed
Duration | 0.001 s
Test case ID | EID8d0318a3-c5e9-45d5-b3af-8c054b0068f5

##### md isdss 2.4: Spatial Representation Type click to expand contents

Test the type of spatial representation of the data.

More information: Spatial Representation Type

Status | Passed
Duration | 0.001 s
Assertion ID | EIDf330358c-8d29-4069-976a-3afb9590ea51
Assertion URI | Link

Expression:let $codes := ('vector','grid','tin','textTable') let $messages := (for $record in $records let $rid := $record/gmd:fileIdentifier/*/text() let $spatialRepTypeCodes := $record/gmd:identificationInfo[1]/gmd:MD_DataIdentification/gmd:spatialRepresentationType/gmd:MD_SpatialRepresentationTypeCode return if (count($spatialRepTypeCodes) = 0) then local:addMessage('TR.spatialRepTypeCodes', map { 'filename': local:filename($record), 'id': $rid }) else for $typeCode in $spatialRepTypeCodes let $codeListValue := $typeCode/@codeListValue let $invalidCodeValues := $codeListValue[not(. = $codes)] return if ($invalidCodeValues) then local:addMessage('TR.invalidSpatialRepresentationCode', map { 'filename': local:filename($record), 'id': $rid }) else () )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

##### md isdss 2.5: Character Encoding click to expand contents

Test that the character encoding for data sets and series is provided correctly.

More information: Character Encoding

Status | Passed
Duration | 0.001 s
Assertion ID | EID83d11da2-265d-4080-bdc3-c25a325b824d
Assertion URI | Link

Expression:let $codes := ('ucs2','ucs4','utf7','utf8','8859part1','8859part2','8859part3','8859part4','8859part5','8859part6','8859part7','8859part8','8859part9','8859part10','8859part11','8859part12','8859part13','8859part14','8859part15','8859part16','jis','shiftJIS','eucJP','usAscii','eucKR','big5','GB2312') let $messages := (for $record in $records let $rid := $record/gmd:fileIdentifier/*/text() let $characterCodes := $record/gmd:identificationInfo[1]/gmd:MD_DataIdentification/gmd:characterSet/gmd:MD_CharacterSetCode return for $characterCode in $characterCodes let $codeListValue := $characterCode/@codeListValue let $invalidCodeValues := $codeListValue[not(. = $codes)] return if ($invalidCodeValues) then local:addMessage('TR.invalidEncodingCode', map { 'filename': local:filename($record), 'id': $rid}) else () )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

### Distribution
1
click to expand contents

Execute tests that apply for all dataset / dataset series metadata records on elements that are child elements of the section of the XML document: Distribution Information (property of the gmd:MD_Metadata element). This section contains information about who makes a resource available and how to get it.

Status | Passed
Duration | 0.001 s
Test case ID | EIDde81899f-3d21-4795-926e-93a731d68edf

##### md isdss 2.6: Data Encoding click to expand contents

Evaluate encoding and the storage or transmission format for data sets and series.

More information: Data Encoding

Status | Passed
Duration | 0.001 s
Assertion ID | EID67230a54-f9b0-49d9-8928-fc5cf5d3ea8a
Assertion URI | Link

Expression:let $messages := (for $record in $records let $rid := $record/gmd:fileIdentifier/*/text() let $distFormats := $record/gmd:distributionInfo[1]/gmd:MD_Distribution/gmd:distributionFormat return if (count($distFormats) = 0) then local:addMessage('TR.noDistFormat', map { 'filename': local:filename($record), 'id': $rid }) else for $format in $distFormats let $name := $format/gmd:MD_Format/gmd:name let $version := $format/gmd:MD_Format/gmd:version return if (not($name) or not(string-length($name/gco:CharacterString/text()) != 0 or string-length($name/gmx:Anchor/text()) != 0)) then local:addMessage('TR.emptyName', map { 'filename': local:filename($record), 'id': $rid }) else if(string-length(normalize-space($version/*/text())) != 0) then if (not($version) or not(string-length($version/gco:CharacterString/text()) != 0 or string-length($version/gmx:Anchor/text()) != 0)) then local:addMessage('TR.emptyVersion', map { 'filename': local:filename($record), 'id': $rid }) else () else if (not($version/@gco:nilReason = 'unknown' or $version/@gco:nilReason = 'inapplicable')) then local:addMessage('TR.invalidVersion', map { 'filename': local:filename($record), 'id': $rid }) else () )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

### Data Quality
2
click to expand contents

Execute tests that apply for all dataset / dataset series metadata records on elements that are child elements of the section of the XML document: Data Quality Information (property of the gmd:MD_Metadata element). This section contains information specific to the quality and lineage (including processing steps and sources) of the resource.

Status | Passed
Duration | 0.001 s
Test case ID | EIDb7cf88c8-4ebe-4fdb-93e6-58794455c3fa

##### md isdss 2.7: Topological Consistency Quantitative Results click to expand contents

Test that the topological consistency quantitative results is provided correctly.

More information: Topological Consistency Quantitative Results

Status | Passed
Duration | 0.001 s
Assertion ID | EID0c1ad661-f3bf-49a5-b38a-3dd68e2c7bfd
Assertion URI | Link

Expression:let $messages := (for $record in $records let $rid := $record/gmd:fileIdentifier/*/text() let $results := $record/gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:report/gmd:DQ_TopologicalConsistency/gmd:result/gmd:DQ_QuantitativeResult return for $result in $results let $measureName := $result/../../gmd:nameOfMeasure/*[1]/text() let $valueRecord := $result/gmd:value/gco:Record let $type := $result/gmd:value/gco:Record/@xsi:type return if (not($result/gmd:valueUnit)) then local:addMessage('TR.noValueUnit', map { 'filename': local:filename($record), 'id': $rid, 'measureName': $measureName }) else if (not($valueRecord)) then local:addMessage('TR.noValueRecord', map { 'filename': local:filename($record), 'id': $rid, 'measureName': $measureName }) else if (not($type)) then local:addMessage('TR.noTypeRecord', map { 'filename': local:filename($record), 'id': $rid, 'measureName': $measureName }) else () )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

##### md isdss 2.8: Topological Consistency Descriptive Results click to expand contents

Test that the topological consistency descriptive results is provided correctly.

More information: Topological Consistency Descriptive Results

Status | Passed
Duration | 0.001 s
Assertion ID | EID9fa0176c-5cc8-458b-9795-45f9a949cc56
Assertion URI | Link

Expression:let $titleINSPIRE := 'INSPIRE Data Specifications - Base Models - Generic Network Model' let $messages := (for $record in $records let $rid := $record/gmd:fileIdentifier/*/text() let $results := $record/gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:report/gmd:DQ_TopologicalConsistency/gmd:result/gmd:DQ_ConformanceResult return for $result in $results let $measureName := $result/../../gmd:nameOfMeasure/*[1]/text() let $title := $result/gmd:specification/gmd:CI_Citation/gmd:title/*/text() let $date := $result/gmd:specification/gmd:CI_Citation/gmd:date/gmd:CI_Date/gmd:date/*/text() let $dateTypeCode := $result/gmd:specification/gmd:CI_Citation/gmd:date/gmd:CI_Date/gmd:dateType/gmd:CI_DateTypeCode/@codeListValue let $pass := $result/gmd:pass let $explanation := $result/gmd:explanation return if (not($title = $titleINSPIRE)) then local:addMessage('TR.invalidTitle', map { 'filename': local:filename($record), 'id': $rid }) else if (not($date)) then local:addMessage('TR.noDateElement', map { 'filename': local:filename($record), 'id': $rid }) else if (not($dateTypeCode = 'publication')) then local:addMessage('TR.noDateCodeList', map { 'filename': local:filename($record), 'id': $rid }) else if (not($pass = 'false')) then local:addMessage('TR.invalidPass', map { 'filename': local:filename($record), 'id': $rid }) else if (not($explanation)) then local:addMessage('TR.noExplanation', map { 'filename': local:filename($record), 'id': $rid }) else if (not(string-length($explanation/gco:CharacterString/text()) != 0 or string-length($explanation/gmx:Anchor/text()) != 0)) then local:addMessage('TR.emptyExplanation', map { 'filename': local:filename($record), 'id': $rid }) else () )[position() le $limitErrors] return (if ($messages) then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

## Conformance Class 2b: INSPIRE data sets and data set series metadata for Monitoring
1

This test suite examines metadata records against the requirements for metadata in INSPIRE.
Please report any issues or problems in GitHub.
Known limitations are documented in the description of the applicable test case or test assertion.
Source: Conformance Class 2b: INSPIRE data sets and data set series metadata for Monitoring

Status | Passed
Duration | 2.348 s
Test suite ID | EID0b86f7a3-2947-4841-823d-6a00d8e06d70
Author | Consortium Bilbomatica, Guadaltel y Geograma
Date created | 14/01/2020 00:00:00 GMT
Version | 1.0.2
Last editor | Consortium Bilbomatica, Guadaltel y Geograma
Last updated | 24/07/2020 11:00:00 GMT
Reference | Link
Hash | CBF29CE484222325

### Monitoring requirements
2
click to expand contents

Execute tests that apply for monitoring metadata.

Status | Passed
Duration | 2.348 s
Test case ID | EID1d36be2a-6236-430e-8221-b6705d9accda

##### M.1: Spatial scope keyword click to expand contents

Test that the spatial scope covered by the data set or data set series is provided.

More information: Spatial Scope Keyword

Status | Passed
Duration | 0.675 s
Assertion ID | EIDa09768e4-1fab-48b4-ac7c-3dc0af7e8649
Assertion URI | Link

Expression:let $messages := (for $record in $records let $rid := $record/gmd:fileIdentifier/*/text() let $validDate := '2019-05-22' let $spatialScopeCodeList := 'http://inspire.ec.europa.eu/metadata-codelist/SpatialScope' let $spatialScopeRegistryUrl := 'http://inspire.ec.europa.eu/metadata-codelist/SpatialScope/SpatialScope' let $officialLanguages := ('bg','cs','da','de','et','el','en','es','fr','hr','it','lv','lt','hu','mt','nl','pl','pt','ro','sk','sl','fi','sv') let $spatialScopeCodelistValue := local:get-code-titles($spatialScopeCodeList, $officialLanguages) let $spatialScopeLabels := ( for $lang in $officialLanguages let $url := $spatialScopeRegistryUrl || '.' || $lang || '.xml' return try { fn:doc($url)/*:metadata-codelist/*:label/text() } catch * { error((), $url || ' cannot be accessed.') } ) let $codeValues := local:get-code-list-values($spatialScopeCodeList) let $spatialScopeCodelistUri := for $x in $codeValues return fn:concat($spatialScopeCodeList, '/', $x) let $descriptiveKeywords := if ($record/gmd:hierarchyLevel/gmd:MD_ScopeCode/@codeListValue = 'service') then $record/gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:descriptiveKeywords else $record/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:descriptiveKeywords let $MD_KeywordsSpatialScope := for $x in $descriptiveKeywords/gmd:MD_Keywords where $x/gmd:thesaurusName/gmd:CI_Citation/gmd:title/gmx:Anchor/@xlink:href = $spatialScopeCodeList or $x/gmd:thesaurusName/gmd:CI_Citation/gmd:title/gco:CharacterString = $spatialScopeLabels return $x let $keywordAnchorSpatialScope := for $x in $descriptiveKeywords/gmd:MD_Keywords/gmd:keyword where $x/gmx:Anchor/@xlink:href[starts-with(.,$spatialScopeCodeList)] return $x let $validAnchorInMD_KeywordsSpatialScope := for $x in $MD_KeywordsSpatialScope/gmd:keyword where ($x/gmx:Anchor/@xlink:href = $spatialScopeCodelistUri) return $x let $validCharacterStringInMD_KeywordsSpatialScope := for $x in $MD_KeywordsSpatialScope/gmd:keyword where ($x/gco:CharacterString = $spatialScopeCodelistValue) return $x let $thesaurusAnchorCodelist := for $x in $descriptiveKeywords/gmd:MD_Keywords where $x/gmd:keyword/gmx:Anchor/@xlink:href[starts-with(.,$spatialScopeCodeList)] and count($x/gmd:thesaurusName/gmd:CI_Citation/gmd:title/gmx:Anchor/@xlink:href) > 0 return $x/gmd:thesaurusName/gmd:CI_Citation/gmd:title/gmx:Anchor let $validThesaurusAnchorCodelist := for $x in $thesaurusAnchorCodelist where $x/@xlink:href = $spatialScopeCodeList return $x let $thesaurusNameTitle := if ($record/gmd:hierarchyLevel/gmd:MD_ScopeCode/@codeListValue = 'service') then $record/gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:descriptiveKeywords/gmd:MD_Keywords/gmd:thesaurusName/gmd:CI_Citation/gmd:title else $record/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:descriptiveKeywords/gmd:MD_Keywords/gmd:thesaurusName/gmd:CI_Citation/gmd:title return if (count($MD_KeywordsSpatialScope) = 0 and count($keywordAnchorSpatialScope) = 0) then local:addMessage('TR.manualCheckSpatialScope', map { 'filename': local:filename($record), 'id': $rid }) else if (count($MD_KeywordsSpatialScope) > 1) then local:addMessage('TR.spatialScopeMultiplicity', map { 'filename': local:filename($record), 'id': $rid }) else if (count($MD_KeywordsSpatialScope/gmd:keyword) > 1) then local:addMessage('TR.spatialScopeKeywordMultiplicity', map { 'filename': local:filename($record), 'id': $rid }) else if (count($thesaurusAnchorCodelist) = 1 and count($validThesaurusAnchorCodelist) = 0) then local:addMessage('TR.spatialScopeInvalidThesaurusCodelist', map { 'filename': local:filename($record), 'id': $rid }) else if (count($keywordAnchorSpatialScope) = 1 and count($thesaurusNameTitle) = 0) then local:addMessage('TR.spatialScopeCitationMissing', map { 'filename': local:filename($record), 'id': $rid }) else if (count($keywordAnchorSpatialScope) > 1) then local:addMessage('TR.spatialScopeKeywordMultiplicity', map { 'filename': local:filename($record), 'id': $rid }) else if (count($keywordAnchorSpatialScope) = 1 and not(count($validAnchorInMD_KeywordsSpatialScope) = 1)) then local:addMessage('TR.spatialScopeInvalidCodelistUri', map { 'filename': local:filename($record), 'id': $rid }) else if (count($keywordAnchorSpatialScope) = 0 and not(count($validCharacterStringInMD_KeywordsSpatialScope) = 1)) then local:addMessage('TR.spatialScopeInvalidCodelistValue', map { 'filename': local:filename($record), 'id': $rid }) else if (not ($MD_KeywordsSpatialScope/gmd:thesaurusName/gmd:CI_Citation/gmd:date/gmd:CI_Date/gmd:date/gco:Date = $validDate)) then local:addMessage('TR.spatialScopeInvalidDate', map { 'filename': local:filename($record), 'id': $rid }) else if (count($validAnchorInMD_KeywordsSpatialScope) != 1 and count($validCharacterStringInMD_KeywordsSpatialScope) != 1) then local:addMessage('TR.spatialScopeExactlyOneKeyword', map { 'filename': local:filename($record), 'id': $rid }) else if ($MD_KeywordsSpatialScope/gmd:thesaurusName/gmd:CI_Citation/gmd:date/gmd:CI_Date/gmd:dateType/gmd:CI_DateTypeCode/@codeListValue != 'publication') then local:addMessage('TR.spatialScopeInvalidDateCodeListValue', map { 'filename': local:filename($record), 'id': $rid }) else() )[position() le $limitErrors] return (if ($messages/@ref = 'TR.manualCheckSpatialScope') then 'PASSED_MANUAL' else if ($messages/@ref = 'TR.spatialScopeMultiplicity') then 'FAILED' else if ($messages/@ref = 'TR.spatialScopeKeywordMultiplicity') then 'FAILED' else if ($messages/@ref = 'TR.spatialScopeInvalidThesaurusCodelist') then 'FAILED' else if ($messages/@ref = 'TR.spatialScopeCitationMissing') then 'FAILED' else if ($messages/@ref = 'TR.spatialScopeInvalidCodelistUri') then 'FAILED' else if ($messages/@ref = 'TR.spatialScopeInvalidCodelistValue') then 'FAILED' else if ($messages/@ref = 'TR.spatialScopeInvalidDate') then 'FAILED' else if ($messages/@ref = 'TR.spatialScopeExactlyOneKeyword') then 'FAILED' else if ($messages/@ref = 'TR.spatialScopeInvalidDateCodeListValue') then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

##### M.2: Priority datasets keyword click to expand contents

Test that keyword(s) for priority data sets are provided in the metadata.

More information: Priority Datasets Keyword

Status | Passed
Duration | 1.673 s
Assertion ID | EID5147ecc7-bc34-4283-a6a2-8adf34581106
Assertion URI | Link

Expression:let $messages := (for $record in $records let $rid := $record/gmd:fileIdentifier/*/text() let $validDate := '2018-04-04' let $priorityDatasetsCodeList := 'http://inspire.ec.europa.eu/metadata-codelist/PriorityDataset' let $priorityDatasetRegistryUrl := 'http://inspire.ec.europa.eu/metadata-codelist/PriorityDataset/PriorityDataset' let $officialLanguages := ('bg','cs','da','de','et','el','en','es','fr','hr','it','lv','lt','hu','mt','nl','pl','pt','ro','sk','sl','fi','sv') let $priorityDatasetsCodelistValue := local:get-code-titles($priorityDatasetsCodeList, $officialLanguages) let $priorityDatasetLabels := ( for $lang in $officialLanguages let $url := $priorityDatasetRegistryUrl || '.' || $lang || '.xml' return try { fn:doc($url)/*:metadata-codelist/*:label/text() } catch * { error((), $url || ' cannot be accessed.') } ) let $codeValues := local:get-code-list-values($priorityDatasetsCodeList) let $priorityDatasetsCodelistUri := for $x in $codeValues return fn:concat($priorityDatasetsCodeList, '/', $x) let $descriptiveKeywords := if ($record/gmd:hierarchyLevel/gmd:MD_ScopeCode/@codeListValue = 'service') then $record/gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:descriptiveKeywords else $record/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:descriptiveKeywords let $MD_KeywordsPriorityDatasets := for $x in $descriptiveKeywords/gmd:MD_Keywords where $x/gmd:thesaurusName/gmd:CI_Citation/gmd:title/gmx:Anchor/@xlink:href = $priorityDatasetsCodeList or $x/gmd:thesaurusName/gmd:CI_Citation/gmd:title/gco:CharacterString = $priorityDatasetLabels return $x let $keywordAnchorPriorityDatasets := for $x in $descriptiveKeywords/gmd:MD_Keywords/gmd:keyword where $x/gmx:Anchor/@xlink:href[starts-with(.,$priorityDatasetsCodeList)] return $x let $validAnchorInMD_KeywordsPriorityDatasets := for $x in $MD_KeywordsPriorityDatasets/gmd:keyword where ($x/gmx:Anchor/@xlink:href = $priorityDatasetsCodelistUri) return $x let $validCharacterStringInMD_KeywordsPriorityDatasets := for $x in $MD_KeywordsPriorityDatasets/gmd:keyword where ($x/gco:CharacterString = $priorityDatasetsCodelistValue) return $x let $thesaurusAnchorCodelist := for $x in $descriptiveKeywords/gmd:MD_Keywords where $x/gmd:keyword/gmx:Anchor/@xlink:href[starts-with(.,$priorityDatasetsCodeList)] and count($x/gmd:thesaurusName/gmd:CI_Citation/gmd:title/gmx:Anchor/@xlink:href) > 0 return $x/gmd:thesaurusName/gmd:CI_Citation/gmd:title/gmx:Anchor let $validThesaurusAnchorCodelist := for $x in $thesaurusAnchorCodelist where $x/@xlink:href = $priorityDatasetsCodeList return $x let $thesaurusNameTitle := if ($record/gmd:hierarchyLevel/gmd:MD_ScopeCode/@codeListValue = 'service') then $record/gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:descriptiveKeywords/gmd:MD_Keywords/gmd:thesaurusName/gmd:CI_Citation/gmd:title else $record/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:descriptiveKeywords/gmd:MD_Keywords/gmd:thesaurusName/gmd:CI_Citation/gmd:title return if (count($MD_KeywordsPriorityDatasets) = 0 and count($keywordAnchorPriorityDatasets) = 0) then local:addMessage('TR.manualCheckPriorityDatasets', map { 'filename': local:filename($record), 'id': $rid }) else if (count($MD_KeywordsPriorityDatasets) > 1) then local:addMessage('TR.priorityDatasetsMultiplicity', map { 'filename': local:filename($record), 'id': $rid }) else if (count($thesaurusAnchorCodelist) = 1 and count($validThesaurusAnchorCodelist) = 0) then local:addMessage('TR.priorityDatasetsInvalidThesaurusCodelist', map { 'filename': local:filename($record), 'id': $rid }) else if (count($keywordAnchorPriorityDatasets) = 1 and count($thesaurusNameTitle) = 0) then local:addMessage('TR.priorityDatasetsCitationMissing', map { 'filename': local:filename($record), 'id': $rid }) else if (count($validAnchorInMD_KeywordsPriorityDatasets) != count($MD_KeywordsPriorityDatasets/gmd:keyword/gmx:Anchor)) then local:addMessage('TR.priorityDatasetsInvalidKeyword', map { 'filename': local:filename($record), 'id': $rid }) else if (count($validCharacterStringInMD_KeywordsPriorityDatasets) != count($MD_KeywordsPriorityDatasets/gmd:keyword/gco:CharacterString)) then local:addMessage('TR.priorityDatasetsInvalidKeyword', map { 'filename': local:filename($record), 'id': $rid }) else if (count($keywordAnchorPriorityDatasets) != count($validAnchorInMD_KeywordsPriorityDatasets)) then local:addMessage('TR.priorityDatasetsOutsideMDKeyword', map { 'filename': local:filename($record), 'id': $rid }) else if (count($validAnchorInMD_KeywordsPriorityDatasets) = 0 and count($validCharacterStringInMD_KeywordsPriorityDatasets) = 0) then local:addMessage('TR.priorityDatasetsAtleastOneKeyword', map { 'filename': local:filename($record), 'id': $rid }) else if (not ($MD_KeywordsPriorityDatasets/gmd:thesaurusName/gmd:CI_Citation/gmd:date/gmd:CI_Date/gmd:date/gco:Date = $validDate)) then local:addMessage('TR.priorityDatasetsInvalidDate', map { 'filename': local:filename($record), 'id': $rid }) else if ($MD_KeywordsPriorityDatasets/gmd:thesaurusName/gmd:CI_Citation/gmd:date/gmd:CI_Date/gmd:dateType/gmd:CI_DateTypeCode/@codeListValue != 'publication') then local:addMessage('TR.priorityDatasetsInvalidDateCodeListValue', map { 'filename': local:filename($record), 'id': $rid }) else() )[position() le $limitErrors] return (if ($messages/@ref = 'TR.manualCheckPriorityDatasets') then 'PASSED_MANUAL' else if ($messages/@ref = 'TR.priorityDatasetsMultiplicity') then 'FAILED' else if ($messages/@ref = 'TR.priorityDatasetsInvalidThesaurusCodelist') then 'FAILED' else if ($messages/@ref = 'TR.priorityDatasetsOutsideMDKeyword') then 'FAILED' else if ($messages/@ref = 'TR.priorityDatasetsCitationMissing') then 'FAILED' else if ($messages/@ref = 'TR.priorityDatasetsInvalidDate') then 'FAILED' else if ($messages/@ref = 'TR.priorityDatasetsAtleastOneKeyword') then 'FAILED' else if ($messages/@ref = 'TR.priorityDatasetsInvalidKeyword') then 'FAILED' else if ($messages/@ref = 'TR.priorityDatasetsInvalidDateCodeListValue') then 'FAILED' else 'PASSED', local:error-statistics('TR.recordsWithErrors', count(fn:distinct-values($messages//etf:argument[@token='id']/text()))), $messages)

# Report generated by ETF

Level of detail