dcc 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (336) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +16 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +16 -0
  5. data/.rubocop_todo.yml +10 -0
  6. data/CHANGELOG.adoc +54 -0
  7. data/CONTRIBUTING.adoc +64 -0
  8. data/Gemfile +25 -0
  9. data/LICENSE +21 -0
  10. data/README.adoc +69 -0
  11. data/Rakefile +13 -0
  12. data/dcc.gemspec +41 -0
  13. data/docs/cli-reference.adoc +67 -0
  14. data/docs/getting-started.adoc +117 -0
  15. data/docs/schema-versions.adoc +65 -0
  16. data/examples/build_minimal_dcc.rb +23 -0
  17. data/examples/convert_all_formats.rb +19 -0
  18. data/examples/parse_and_inspect.rb +19 -0
  19. data/examples/quantity_math_demo.rb +32 -0
  20. data/examples/validate_full.rb +27 -0
  21. data/exe/dcc +7 -0
  22. data/lib/dcc/base/administrative_data.rb +43 -0
  23. data/lib/dcc/base/byte_data.rb +36 -0
  24. data/lib/dcc/base/calibration_laboratory.rb +29 -0
  25. data/lib/dcc/base/comment.rb +23 -0
  26. data/lib/dcc/base/condition.rb +34 -0
  27. data/lib/dcc/base/contact.rb +38 -0
  28. data/lib/dcc/base/contact_not_strict.rb +38 -0
  29. data/lib/dcc/base/core_data.rb +44 -0
  30. data/lib/dcc/base/data.rb +42 -0
  31. data/lib/dcc/base/digital_calibration_certificate.rb +32 -0
  32. data/lib/dcc/base/equipment_class.rb +24 -0
  33. data/lib/dcc/base/formula.rb +33 -0
  34. data/lib/dcc/base/hash_type.rb +34 -0
  35. data/lib/dcc/base/identification.rb +27 -0
  36. data/lib/dcc/base/identifications.rb +27 -0
  37. data/lib/dcc/base/influence_condition.rb +16 -0
  38. data/lib/dcc/base/influence_condition_list.rb +40 -0
  39. data/lib/dcc/base/item.rb +38 -0
  40. data/lib/dcc/base/item_list.rb +38 -0
  41. data/lib/dcc/base/list.rb +44 -0
  42. data/lib/dcc/base/location.rb +36 -0
  43. data/lib/dcc/base/measurement_meta_data.rb +15 -0
  44. data/lib/dcc/base/measurement_meta_data_list.rb +27 -0
  45. data/lib/dcc/base/measurement_result.rb +41 -0
  46. data/lib/dcc/base/measurement_result_list.rb +28 -0
  47. data/lib/dcc/base/measuring_equipment.rb +41 -0
  48. data/lib/dcc/base/measuring_equipment_list.rb +38 -0
  49. data/lib/dcc/base/quantity.rb +61 -0
  50. data/lib/dcc/base/ref_type_definition.rb +36 -0
  51. data/lib/dcc/base/ref_type_definition_list.rb +21 -0
  52. data/lib/dcc/base/resp_person.rb +38 -0
  53. data/lib/dcc/base/resp_person_list.rb +27 -0
  54. data/lib/dcc/base/result.rb +31 -0
  55. data/lib/dcc/base/result_list.rb +27 -0
  56. data/lib/dcc/base/rich_content.rb +34 -0
  57. data/lib/dcc/base/software.rb +35 -0
  58. data/lib/dcc/base/software_list.rb +27 -0
  59. data/lib/dcc/base/statement.rb +50 -0
  60. data/lib/dcc/base/statement_list.rb +27 -0
  61. data/lib/dcc/base/string_with_lang.rb +24 -0
  62. data/lib/dcc/base/text.rb +33 -0
  63. data/lib/dcc/base/used_method.rb +31 -0
  64. data/lib/dcc/base/used_method_list.rb +27 -0
  65. data/lib/dcc/base/xml_blob.rb +20 -0
  66. data/lib/dcc/base.rb +58 -0
  67. data/lib/dcc/builder/dsl.rb +10 -0
  68. data/lib/dcc/builder/session.rb +170 -0
  69. data/lib/dcc/builder.rb +34 -0
  70. data/lib/dcc/cli/cli.rb +149 -0
  71. data/lib/dcc/cli/formatters.rb +77 -0
  72. data/lib/dcc/cli.rb +7 -0
  73. data/lib/dcc/common_elements.rb +20 -0
  74. data/lib/dcc/context_configuration.rb +167 -0
  75. data/lib/dcc/context_options.rb +47 -0
  76. data/lib/dcc/convert/csv.rb +129 -0
  77. data/lib/dcc/convert/html.rb +127 -0
  78. data/lib/dcc/convert/json.rb +62 -0
  79. data/lib/dcc/convert/result.rb +51 -0
  80. data/lib/dcc/convert/yaml.rb +21 -0
  81. data/lib/dcc/convert.rb +14 -0
  82. data/lib/dcc/diff/change.rb +21 -0
  83. data/lib/dcc/diff/result.rb +58 -0
  84. data/lib/dcc/diff.rb +83 -0
  85. data/lib/dcc/error.rb +54 -0
  86. data/lib/dcc/extract/file.rb +143 -0
  87. data/lib/dcc/extract/ring.rb +28 -0
  88. data/lib/dcc/extract.rb +9 -0
  89. data/lib/dcc/i18n/text_lookup.rb +67 -0
  90. data/lib/dcc/i18n.rb +12 -0
  91. data/lib/dcc/inspect/report.rb +139 -0
  92. data/lib/dcc/inspect.rb +9 -0
  93. data/lib/dcc/migrate.rb +41 -0
  94. data/lib/dcc/namespace/dcc.rb +30 -0
  95. data/lib/dcc/namespace/dsig.rb +15 -0
  96. data/lib/dcc/namespace/math_ml.rb +14 -0
  97. data/lib/dcc/namespace/qudt.rb +15 -0
  98. data/lib/dcc/namespace/si.rb +26 -0
  99. data/lib/dcc/namespace.rb +18 -0
  100. data/lib/dcc/plugin/registry.rb +45 -0
  101. data/lib/dcc/plugin.rb +42 -0
  102. data/lib/dcc/quantity_format/formatter.rb +90 -0
  103. data/lib/dcc/quantity_format.rb +10 -0
  104. data/lib/dcc/quantity_math/quantity.rb +46 -0
  105. data/lib/dcc/quantity_math/real.rb +116 -0
  106. data/lib/dcc/quantity_math.rb +14 -0
  107. data/lib/dcc/schema/resources/dcc/dsi/v1.0.1.xsd +415 -0
  108. data/lib/dcc/schema/resources/dcc/dsi/v1.3.0.xsd +814 -0
  109. data/lib/dcc/schema/resources/dcc/dsi/v1.3.1.xsd +814 -0
  110. data/lib/dcc/schema/resources/dcc/dsi/v2.0.0.xsd +869 -0
  111. data/lib/dcc/schema/resources/dcc/dsi/v2.1.0.xsd +1031 -0
  112. data/lib/dcc/schema/resources/dcc/dsi/v2.2.1.xsd +1574 -0
  113. data/lib/dcc/schema/resources/dcc/qudt/v2.2.1.xsd +44 -0
  114. data/lib/dcc/schema/resources/dcc/v2.1.0/dcc.xsd +650 -0
  115. data/lib/dcc/schema/resources/dcc/v2.1.1/dcc.xsd +669 -0
  116. data/lib/dcc/schema/resources/dcc/v2.2.0/dcc.xsd +730 -0
  117. data/lib/dcc/schema/resources/dcc/v2.3.0/dcc.xsd +708 -0
  118. data/lib/dcc/schema/resources/dcc/v2.4.0/dcc.xsd +725 -0
  119. data/lib/dcc/schema/resources/dcc/v3.0.0/dcc.xsd +749 -0
  120. data/lib/dcc/schema/resources/dcc/v3.1.0/dcc.xsd +843 -0
  121. data/lib/dcc/schema/resources/dcc/v3.1.1/dcc.xsd +843 -0
  122. data/lib/dcc/schema/resources/dcc/v3.1.2/dcc.xsd +844 -0
  123. data/lib/dcc/schema/resources/dcc/v3.2.0/dcc.xsd +940 -0
  124. data/lib/dcc/schema/resources/dcc/v3.2.1/dcc.xsd +963 -0
  125. data/lib/dcc/schema/resources/dcc/v3.3.0/dcc.xsd +1008 -0
  126. data/lib/dcc/schema/resources/dcc/xmldsig-core-schema.xsd +312 -0
  127. data/lib/dcc/schema/resources/dsi/qudt/v2.2.1.xsd +44 -0
  128. data/lib/dcc/schema/resources/dsi/v1.0.1/SI_Format.xsd +415 -0
  129. data/lib/dcc/schema/resources/dsi/v1.3.0/SI_Format.xsd +814 -0
  130. data/lib/dcc/schema/resources/dsi/v1.3.1/SI_Format.xsd +814 -0
  131. data/lib/dcc/schema/resources/dsi/v2.0.0/SI_Format.xsd +869 -0
  132. data/lib/dcc/schema/resources/dsi/v2.1.0/SI_Format.xsd +1031 -0
  133. data/lib/dcc/schema/resources/dsi/v2.2.1/SI_Format.xsd +1574 -0
  134. data/lib/dcc/schema/resources/qudt/qudt.xsd +44 -0
  135. data/lib/dcc/schema/resources/schematron/dcc.sch +523 -0
  136. data/lib/dcc/schema/resources/schematron/dcc.svrl +2302 -0
  137. data/lib/dcc/schema/resources/xmldsig/xmldsig-core-schema.xsd +312 -0
  138. data/lib/dcc/schema/version.rb +94 -0
  139. data/lib/dcc/schema.rb +35 -0
  140. data/lib/dcc/server/app.rb +133 -0
  141. data/lib/dcc/server/storage/entry.rb +15 -0
  142. data/lib/dcc/server/storage/memory.rb +57 -0
  143. data/lib/dcc/server/storage.rb +13 -0
  144. data/lib/dcc/server.rb +33 -0
  145. data/lib/dcc/si/base/complex.rb +43 -0
  146. data/lib/dcc/si/base/complex_list_xml_list.rb +39 -0
  147. data/lib/dcc/si/base/constant.rb +39 -0
  148. data/lib/dcc/si/base/coverage_interval_mu.rb +31 -0
  149. data/lib/dcc/si/base/expanded_mu.rb +29 -0
  150. data/lib/dcc/si/base/expanded_unc_xml_list.rb +30 -0
  151. data/lib/dcc/si/base/hybrid.rb +42 -0
  152. data/lib/dcc/si/base/measurement_uncertainty_univariate.rb +28 -0
  153. data/lib/dcc/si/base/real.rb +48 -0
  154. data/lib/dcc/si/base/real_list_xml_list.rb +45 -0
  155. data/lib/dcc/si/base/si_list.rb +37 -0
  156. data/lib/dcc/si/base/standard_mu.rb +25 -0
  157. data/lib/dcc/si/base.rb +24 -0
  158. data/lib/dcc/si/common_elements.rb +13 -0
  159. data/lib/dcc/si/namespace.rb +7 -0
  160. data/lib/dcc/si/v1/common_elements.rb +13 -0
  161. data/lib/dcc/si/v1/complex.rb +8 -0
  162. data/lib/dcc/si/v1/complex_list_xml_list.rb +8 -0
  163. data/lib/dcc/si/v1/configuration.rb +13 -0
  164. data/lib/dcc/si/v1/constant.rb +8 -0
  165. data/lib/dcc/si/v1/coverage_interval_mu.rb +8 -0
  166. data/lib/dcc/si/v1/expanded_mu.rb +8 -0
  167. data/lib/dcc/si/v1/expanded_unc.rb +23 -0
  168. data/lib/dcc/si/v1/expanded_unc_xml_list.rb +8 -0
  169. data/lib/dcc/si/v1/hybrid.rb +8 -0
  170. data/lib/dcc/si/v1/measurement_uncertainty_univariate.rb +8 -0
  171. data/lib/dcc/si/v1/namespace.rb +9 -0
  172. data/lib/dcc/si/v1/real.rb +8 -0
  173. data/lib/dcc/si/v1/real_list_xml_list.rb +8 -0
  174. data/lib/dcc/si/v1/si_list.rb +8 -0
  175. data/lib/dcc/si/v1/standard_mu.rb +8 -0
  176. data/lib/dcc/si/v1.rb +46 -0
  177. data/lib/dcc/si/v2/common_elements.rb +13 -0
  178. data/lib/dcc/si/v2/complex.rb +8 -0
  179. data/lib/dcc/si/v2/complex_list_xml_list.rb +8 -0
  180. data/lib/dcc/si/v2/configuration.rb +13 -0
  181. data/lib/dcc/si/v2/constant.rb +8 -0
  182. data/lib/dcc/si/v2/coverage_interval_mu.rb +8 -0
  183. data/lib/dcc/si/v2/coverage_interval_mu_xml_list.rb +24 -0
  184. data/lib/dcc/si/v2/expanded_mu.rb +8 -0
  185. data/lib/dcc/si/v2/expanded_mu_xml_list.rb +22 -0
  186. data/lib/dcc/si/v2/expanded_unc_xml_list.rb +8 -0
  187. data/lib/dcc/si/v2/hybrid.rb +8 -0
  188. data/lib/dcc/si/v2/measurement_uncertainty_univariate.rb +8 -0
  189. data/lib/dcc/si/v2/namespace.rb +9 -0
  190. data/lib/dcc/si/v2/real.rb +8 -0
  191. data/lib/dcc/si/v2/real_list_xml_list.rb +8 -0
  192. data/lib/dcc/si/v2/si_list.rb +8 -0
  193. data/lib/dcc/si/v2/standard_mu.rb +8 -0
  194. data/lib/dcc/si/v2/standard_mu_xml_list.rb +18 -0
  195. data/lib/dcc/si/v2.rb +49 -0
  196. data/lib/dcc/si.rb +34 -0
  197. data/lib/dcc/signature/result.rb +43 -0
  198. data/lib/dcc/signature/signer.rb +36 -0
  199. data/lib/dcc/signature/verifier.rb +41 -0
  200. data/lib/dcc/signature.rb +13 -0
  201. data/lib/dcc/transform/result.rb +24 -0
  202. data/lib/dcc/transform/xslt.rb +72 -0
  203. data/lib/dcc/transform.rb +12 -0
  204. data/lib/dcc/type/base64_binary.rb +55 -0
  205. data/lib/dcc/type/decimal_xml_list.rb +47 -0
  206. data/lib/dcc/type/iso_country_code.rb +23 -0
  207. data/lib/dcc/type/iso_language_code.rb +23 -0
  208. data/lib/dcc/type/schema_version.rb +37 -0
  209. data/lib/dcc/type/si_unit.rb +26 -0
  210. data/lib/dcc/type.rb +16 -0
  211. data/lib/dcc/type_guards.rb +140 -0
  212. data/lib/dcc/v2/administrative_data.rb +8 -0
  213. data/lib/dcc/v2/byte_data.rb +8 -0
  214. data/lib/dcc/v2/calibration_laboratory.rb +8 -0
  215. data/lib/dcc/v2/comment.rb +8 -0
  216. data/lib/dcc/v2/common_elements.rb +13 -0
  217. data/lib/dcc/v2/condition.rb +8 -0
  218. data/lib/dcc/v2/configuration.rb +17 -0
  219. data/lib/dcc/v2/contact.rb +8 -0
  220. data/lib/dcc/v2/contact_not_strict.rb +8 -0
  221. data/lib/dcc/v2/core_data.rb +8 -0
  222. data/lib/dcc/v2/data.rb +8 -0
  223. data/lib/dcc/v2/digital_calibration_certificate.rb +8 -0
  224. data/lib/dcc/v2/equipment_class.rb +8 -0
  225. data/lib/dcc/v2/formula.rb +8 -0
  226. data/lib/dcc/v2/hash_type.rb +8 -0
  227. data/lib/dcc/v2/identification.rb +8 -0
  228. data/lib/dcc/v2/identifications.rb +8 -0
  229. data/lib/dcc/v2/influence_condition.rb +7 -0
  230. data/lib/dcc/v2/influence_condition_list.rb +8 -0
  231. data/lib/dcc/v2/item.rb +8 -0
  232. data/lib/dcc/v2/item_list.rb +8 -0
  233. data/lib/dcc/v2/list.rb +8 -0
  234. data/lib/dcc/v2/location.rb +8 -0
  235. data/lib/dcc/v2/measurement_meta_data.rb +8 -0
  236. data/lib/dcc/v2/measurement_meta_data_list.rb +8 -0
  237. data/lib/dcc/v2/measurement_result.rb +8 -0
  238. data/lib/dcc/v2/measurement_result_list.rb +8 -0
  239. data/lib/dcc/v2/measuring_equipment.rb +8 -0
  240. data/lib/dcc/v2/measuring_equipment_list.rb +8 -0
  241. data/lib/dcc/v2/namespace.rb +8 -0
  242. data/lib/dcc/v2/quantity.rb +49 -0
  243. data/lib/dcc/v2/ref_type_definition.rb +11 -0
  244. data/lib/dcc/v2/ref_type_definition_list.rb +15 -0
  245. data/lib/dcc/v2/resp_person.rb +8 -0
  246. data/lib/dcc/v2/resp_person_list.rb +8 -0
  247. data/lib/dcc/v2/result.rb +8 -0
  248. data/lib/dcc/v2/result_list.rb +8 -0
  249. data/lib/dcc/v2/rich_content.rb +12 -0
  250. data/lib/dcc/v2/software.rb +8 -0
  251. data/lib/dcc/v2/software_list.rb +8 -0
  252. data/lib/dcc/v2/statement.rb +8 -0
  253. data/lib/dcc/v2/statement_list.rb +8 -0
  254. data/lib/dcc/v2/string_with_lang.rb +8 -0
  255. data/lib/dcc/v2/text.rb +8 -0
  256. data/lib/dcc/v2/used_method.rb +8 -0
  257. data/lib/dcc/v2/used_method_list.rb +8 -0
  258. data/lib/dcc/v2/xml_blob.rb +8 -0
  259. data/lib/dcc/v2.rb +84 -0
  260. data/lib/dcc/v3/administrative_data.rb +8 -0
  261. data/lib/dcc/v3/byte_data.rb +8 -0
  262. data/lib/dcc/v3/calibration_laboratory.rb +8 -0
  263. data/lib/dcc/v3/comment.rb +8 -0
  264. data/lib/dcc/v3/common_elements.rb +11 -0
  265. data/lib/dcc/v3/condition.rb +8 -0
  266. data/lib/dcc/v3/configuration.rb +17 -0
  267. data/lib/dcc/v3/contact.rb +8 -0
  268. data/lib/dcc/v3/contact_not_strict.rb +8 -0
  269. data/lib/dcc/v3/core_data.rb +8 -0
  270. data/lib/dcc/v3/data.rb +8 -0
  271. data/lib/dcc/v3/digital_calibration_certificate.rb +8 -0
  272. data/lib/dcc/v3/equipment_class.rb +8 -0
  273. data/lib/dcc/v3/formula.rb +8 -0
  274. data/lib/dcc/v3/hash_type.rb +8 -0
  275. data/lib/dcc/v3/identification.rb +8 -0
  276. data/lib/dcc/v3/identifications.rb +8 -0
  277. data/lib/dcc/v3/influence_condition.rb +7 -0
  278. data/lib/dcc/v3/influence_condition_list.rb +8 -0
  279. data/lib/dcc/v3/item.rb +8 -0
  280. data/lib/dcc/v3/item_list.rb +8 -0
  281. data/lib/dcc/v3/list.rb +8 -0
  282. data/lib/dcc/v3/location.rb +8 -0
  283. data/lib/dcc/v3/measurement_meta_data.rb +8 -0
  284. data/lib/dcc/v3/measurement_meta_data_list.rb +8 -0
  285. data/lib/dcc/v3/measurement_result.rb +8 -0
  286. data/lib/dcc/v3/measurement_result_list.rb +8 -0
  287. data/lib/dcc/v3/measuring_equipment.rb +8 -0
  288. data/lib/dcc/v3/measuring_equipment_list.rb +8 -0
  289. data/lib/dcc/v3/namespace.rb +7 -0
  290. data/lib/dcc/v3/quantity.rb +49 -0
  291. data/lib/dcc/v3/ref_type_definition.rb +8 -0
  292. data/lib/dcc/v3/ref_type_definition_list.rb +8 -0
  293. data/lib/dcc/v3/resp_person.rb +8 -0
  294. data/lib/dcc/v3/resp_person_list.rb +8 -0
  295. data/lib/dcc/v3/result.rb +8 -0
  296. data/lib/dcc/v3/result_list.rb +8 -0
  297. data/lib/dcc/v3/rich_content.rb +8 -0
  298. data/lib/dcc/v3/software.rb +8 -0
  299. data/lib/dcc/v3/software_list.rb +8 -0
  300. data/lib/dcc/v3/statement.rb +8 -0
  301. data/lib/dcc/v3/statement_list.rb +8 -0
  302. data/lib/dcc/v3/string_with_lang.rb +8 -0
  303. data/lib/dcc/v3/text.rb +8 -0
  304. data/lib/dcc/v3/used_method.rb +8 -0
  305. data/lib/dcc/v3/used_method_list.rb +8 -0
  306. data/lib/dcc/v3/xml_blob.rb +8 -0
  307. data/lib/dcc/v3.rb +111 -0
  308. data/lib/dcc/validate/business_rules.rb +121 -0
  309. data/lib/dcc/validate/issue.rb +56 -0
  310. data/lib/dcc/validate/result.rb +105 -0
  311. data/lib/dcc/validate/schematron/profile.rb +64 -0
  312. data/lib/dcc/validate/schematron/rule.rb +49 -0
  313. data/lib/dcc/validate/schematron/rules/administrative_data_completeness.rb +42 -0
  314. data/lib/dcc/validate/schematron/rules/base.rb +15 -0
  315. data/lib/dcc/validate/schematron/rules/date_range_check.rb +41 -0
  316. data/lib/dcc/validate/schematron/rules/id_refid_linking.rb +61 -0
  317. data/lib/dcc/validate/schematron/rules/influence_conditions_placement.rb +58 -0
  318. data/lib/dcc/validate/schematron/rules/iso_code_validation.rb +53 -0
  319. data/lib/dcc/validate/schematron/rules/language_code_dedup.rb +39 -0
  320. data/lib/dcc/validate/schematron/rules/non_si_declaration.rb +82 -0
  321. data/lib/dcc/validate/schematron/rules/release_format_check.rb +44 -0
  322. data/lib/dcc/validate/schematron/rules/schema_version_check.rb +31 -0
  323. data/lib/dcc/validate/schematron/rules/uncertainty_consistency.rb +58 -0
  324. data/lib/dcc/validate/schematron/rules/unit_format_check.rb +74 -0
  325. data/lib/dcc/validate/schematron/rules/used_methods_placement.rb +65 -0
  326. data/lib/dcc/validate/schematron/rules/used_software_placement.rb +43 -0
  327. data/lib/dcc/validate/schematron/rules/xml_list_spacing.rb +42 -0
  328. data/lib/dcc/validate/schematron/rules.rb +30 -0
  329. data/lib/dcc/validate/schematron.rb +22 -0
  330. data/lib/dcc/validate/severity.rb +39 -0
  331. data/lib/dcc/validate/xsd.rb +97 -0
  332. data/lib/dcc/validate.rb +15 -0
  333. data/lib/dcc/version.rb +5 -0
  334. data/lib/dcc/versioned_parser.rb +48 -0
  335. data/lib/dcc.rb +141 -0
  336. metadata +425 -0
@@ -0,0 +1,44 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <xs:schema version="2.2.1" xmlns:xs="http://www.w3.org/2001/XMLSchema"
3
+ targetNamespace="http://qudt.org/vocab/"
4
+ xmlns:qudt="http://qudt.org/vocab/"
5
+ elementFormDefault="qualified">
6
+
7
+ <xs:annotation>
8
+ <xs:documentation xml:lang="en">
9
+ D-SI - Digital System of Units
10
+ Copyright (c) 2018 - 2024 Physikalisch-Technische Bundesanstalt (PTB), all rights reserved.
11
+
12
+ This XML Scheme Definition (XSD) is free software: you can redistribute it and/or modify
13
+ it under the terms of the GNU Lesser General Public License as published by
14
+ the Free Software Foundation, version 3 of the License.
15
+
16
+ This XSD is distributed in the hope that it will be useful,
17
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
18
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
+ GNU Lesser General Public License for more details.
20
+
21
+ You should have received a copy of the GNU Lesser General Public License
22
+ along with this XSD. If not, see http://www.gnu.org/licenses.
23
+
24
+ CONTACT: daniel.hutzschenreuter@ptb.de
25
+ DEVELOPMENT: https://gitlab1.ptb.de/d-ptb/d-si/xsd-d-si
26
+ D-SI XSD VERSION: 2.2.1
27
+ RELEASE DATA: 2024-06-21
28
+ DOI: 10.5281/zenodo.3366901
29
+ </xs:documentation>
30
+ <xs:documentation xml:lang="en">
31
+ ACKNOWLEDGEMENT:
32
+ This schema was developped to link QUDT type entities to the D-SI XML implementation.
33
+ Please, visit qudt.org for information about the QUDT web ontology.
34
+ To access the QUDT entries for quantity kinds from the XML, you can use the following PIDs:
35
+ https://qudt.org/vocab/quantitykind/Length (web page)
36
+ https://qudt.org/vocab/quantitykind/Length.ttl (machine-readable TURTLE data)
37
+ </xs:documentation>
38
+ </xs:annotation>
39
+
40
+ <xs:simpleType name="quantitykind">
41
+ <xs:restriction base="xs:string"/>
42
+ </xs:simpleType>
43
+
44
+ </xs:schema>
@@ -0,0 +1,523 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <sch:schema xmlns:sch="http://purl.oclc.org/dsdl/schematron" queryBinding="xslt2"
3
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
4
+ xmlns:sqf="http://www.schematron-quickfix.com/validator/process">
5
+
6
+ <sch:ns uri="https://ptb.de/dcc" prefix="dcc"/>
7
+ <sch:ns uri="https://ptb.de/si" prefix="si"/>
8
+
9
+ <sch:pattern>
10
+ <xsl:comment>
11
+ This pattern validates the placement of dcc:usedMethods elements within a DCC document.
12
+ Methods can be declared globally under dcc:measurementResult, locally under dcc:list, or individually under
13
+ each dcc:quantity element.
14
+ </xsl:comment>
15
+
16
+ <sch:rule context="//dcc:measurementResult">
17
+ <sch:report role="information" test="count(dcc:usedMethods)">
18
+ Global measurement methods declared for all results in this measurement result section.
19
+ </sch:report>
20
+ </sch:rule>
21
+
22
+ <sch:rule context="//dcc:measurementResults//dcc:list[not(ancestor::dcc:metaData)]">
23
+ <sch:report role="information" test="count(dcc:usedMethods)">
24
+ Local measurement methods declared for all quantities in this list.
25
+ </sch:report>
26
+ <sch:report role="error"
27
+ test="count(dcc:usedMethods)=0 and count(ancestor::dcc:measurementResult/dcc:usedMethods)=0 and count(dcc:quantity)>count(dcc:quantity/dcc:usedMethods)">
28
+ Missing measurement methods: No methods declared globally, locally, or for individual quantities. Each
29
+ quantity must have associated used methods declared.
30
+ </sch:report>
31
+ </sch:rule>
32
+
33
+ <sch:rule context="//dcc:result/dcc:data/dcc:quantity">
34
+ <sch:report role="information" test="count(dcc:usedMethods)">
35
+ Local measurement methods declared for this specific quantity.
36
+ </sch:report>
37
+ <sch:report role="error"
38
+ test="count(dcc:usedMethods)=0 and count(ancestor::dcc:measurementResult/dcc:usedMethods)=0">
39
+ Missing measurement methods: No methods declared globally or locally for this quantity. Measurement
40
+ methods are required.
41
+ </sch:report>
42
+ </sch:rule>
43
+
44
+ <sch:rule context="//dcc:measurementResults//dcc:list[not(ancestor::dcc:metaData)]/dcc:quantity">
45
+ <sch:report role="information" test="count(dcc:usedMethods)">
46
+ Local measurement methods declared for this specific quantity within a list.
47
+ </sch:report>
48
+ </sch:rule>
49
+ </sch:pattern>
50
+
51
+ <sch:pattern>
52
+ <xsl:comment>
53
+ This pattern validates the placement of dcc:usedSoftware elements within a DCC document.
54
+ Software can be declared globally under dcc:measurementResult, locally under dcc:list, or individually under
55
+ each dcc:quantity element.
56
+ </xsl:comment>
57
+
58
+ <sch:rule context="//dcc:measurementResult">
59
+ <sch:report role="information" test="count(dcc:usedSoftware)">
60
+ Global software declaration for all results in this measurement result section.
61
+ </sch:report>
62
+ </sch:rule>
63
+
64
+ <sch:rule context="//dcc:measurementResults//dcc:list[not(ancestor::dcc:metaData)]">
65
+ <sch:report role="information" test="count(dcc:usedSoftware)">
66
+ Local software declaration for all quantities in this list.
67
+ </sch:report>
68
+ <sch:report role="warning"
69
+ test="count(dcc:usedSoftware)=0 and count(ancestor::dcc:measurementResult/dcc:usedSoftware)=0 and count(dcc:quantity)>count(dcc:quantity/dcc:usedSoftware)">
70
+ Software information missing: Consider declaring software used during measurement process (globally,
71
+ locally, or per quantity).
72
+ </sch:report>
73
+ </sch:rule>
74
+
75
+ <sch:rule context="//dcc:result/dcc:data/dcc:quantity">
76
+ <sch:report role="information" test="count(dcc:usedSoftware)">
77
+ Local software declaration for this specific quantity.
78
+ </sch:report>
79
+ <sch:report role="warning"
80
+ test="count(dcc:usedSoftware)=0 and count(ancestor::dcc:measurementResult/dcc:usedSoftware)=0">
81
+ Software information missing: Consider declaring software used for this quantity measurement.
82
+ </sch:report>
83
+ </sch:rule>
84
+
85
+ <sch:rule context="//dcc:measurementResults//dcc:list[not(ancestor::dcc:metaData)]/dcc:quantity">
86
+ <sch:report role="information" test="count(dcc:usedSoftware)">
87
+ Local software declaration for this specific quantity within a list.
88
+ </sch:report>
89
+ </sch:rule>
90
+ </sch:pattern>
91
+
92
+ <sch:pattern>
93
+ <xsl:comment>
94
+ This pattern validates the placement of dcc:influenceConditions elements within a DCC document.
95
+ Influence conditions can be declared globally under dcc:measurementResult, locally under dcc:list, or
96
+ individually under each dcc:quantity element.
97
+ </xsl:comment>
98
+
99
+ <sch:rule context="//dcc:measurementResult">
100
+ <sch:report role="information" test="count(dcc:influenceConditions)">
101
+ Global influence conditions declared for all results in this measurement result section.
102
+ </sch:report>
103
+ </sch:rule>
104
+
105
+ <sch:rule context="//dcc:measurementResults//dcc:list[not(ancestor::dcc:metaData)]">
106
+ <sch:report role="information" test="count(dcc:influenceConditions)">
107
+ Local influence conditions declared for all quantities in this list.
108
+ </sch:report>
109
+ <sch:report role="error"
110
+ test="count(dcc:influenceConditions)=0 and count(ancestor::dcc:measurementResult/dcc:influenceConditions)=0 and count(dcc:quantity)>count(dcc:quantity/dcc:influenceConditions)">
111
+ Missing influence conditions: No conditions declared globally, locally, or for individual quantities.
112
+ Each quantity must have associated influence conditions.
113
+ </sch:report>
114
+ </sch:rule>
115
+
116
+ <sch:rule context="//dcc:result/dcc:data/dcc:quantity">
117
+ <sch:report role="information" test="count(dcc:influenceConditions)">
118
+ Local influence conditions declared for this specific quantity.
119
+ </sch:report>
120
+ <sch:report role="error"
121
+ test="count(dcc:influenceConditions)=0 and count(ancestor::dcc:measurementResult/dcc:influenceConditions)=0">
122
+ Missing influence conditions: No conditions declared globally or locally for this quantity. Influence
123
+ conditions are required.
124
+ </sch:report>
125
+ </sch:rule>
126
+
127
+ <sch:rule context="//dcc:measurementResults//dcc:list[not(ancestor::dcc:metaData)]/dcc:quantity">
128
+ <sch:report role="information" test="count(dcc:influenceConditions)">
129
+ Local influence conditions declared for this specific quantity within a list.
130
+ </sch:report>
131
+ </sch:rule>
132
+ </sch:pattern>
133
+
134
+ <sch:pattern>
135
+ <xsl:comment>
136
+ This pattern validates the DCC schema version to ensure the latest version is being used.
137
+ </xsl:comment>
138
+
139
+ <sch:rule context="dcc:digitalCalibrationCertificate">
140
+ <sch:assert role="warning" test="@schemaVersion='3.3.0'">
141
+ Schema version outdated: You are using schema version '<sch:value-of select="@schemaVersion"/>'. The
142
+ latest available version is 3.3.0. Consider upgrading to ensure compatibility.
143
+ </sch:assert>
144
+ </sch:rule>
145
+ </sch:pattern>
146
+
147
+ <sch:pattern>
148
+ <xsl:comment>
149
+ This pattern validates that all @id and @refId attributes are properly linked within the document.
150
+ </xsl:comment>
151
+
152
+ <sch:let name="refIds" value="//@refId"/>
153
+ <sch:let name="ids" value="//@id"/>
154
+
155
+ <sch:rule context="//@id">
156
+ <sch:assert role="warning" test="some $refId in $refIds satisfies tokenize($refId, ' ') = .">
157
+ Unlinked ID: The ID '<sch:value-of select="."/>' is not referenced by any refId attribute. Every ID
158
+ should be referenced.
159
+ </sch:assert>
160
+ </sch:rule>
161
+
162
+ <sch:rule context="//@refId">
163
+ <sch:assert role="error" test="some $refId in tokenize(., ' ') satisfies $ids = $refId">
164
+ Invalid reference ID: The refId '<sch:value-of select="."/>' does not correspond to any existing ID in
165
+ the document.
166
+ </sch:assert>
167
+ </sch:rule>
168
+ </sch:pattern>
169
+
170
+ <sch:pattern>
171
+ <xsl:comment>
172
+ This pattern validates language attributes in dcc:content elements against declared language codes.
173
+ </xsl:comment>
174
+
175
+ <sch:let name="langs" value="//dcc:usedLangCodeISO639_1"/>
176
+ <sch:let name="langCount" value="count($langs)"/>
177
+
178
+ <sch:rule context="dcc:content[@lang]">
179
+ <sch:assert role="error" test="@lang = $langs">
180
+ Invalid language code: The language code '<sch:value-of select="@lang"/>' is not declared in
181
+ dcc:usedLangCodeISO639_1. Available codes are:<sch:value-of select="string-join($langs,', ')"/>.
182
+ </sch:assert>
183
+ </sch:rule>
184
+
185
+ <sch:rule context="//*[dcc:content[@lang]]">
186
+ <sch:let name="localLangs" value="dcc:content/@lang"/>
187
+
188
+ <sch:assert role="error" test="count($localLangs) = $langCount">
189
+ The dcc:content elements use only [<sch:value-of select="string-join($localLangs, ', ')"/>] of the
190
+ declared languages [<sch:value-of select="string-join($langs, ', ')"/>]. Add missing languages or use
191
+ one without a @lang attribute.
192
+ </sch:assert>
193
+
194
+ <sch:assert role="error" test="count($localLangs) = count(distinct-values($localLangs))">
195
+ Duplicate language codes detected in dcc:content elements: [<sch:value-of
196
+ select="string-join($localLangs, ', ')"/>]. Each dcc:content element must use a unique @lang value.
197
+ </sch:assert>
198
+ </sch:rule>
199
+
200
+ <sch:rule context="dcc:content">
201
+ <sch:report role="warning"
202
+ test="not(@lang) and (count(../../dcc:name)=0 and count(../../dcc:further)=0 and count(../../dcc:referral)=0)">
203
+ Language attribute missing: Consider adding a language attribute to this content element for better
204
+ internationalization.
205
+ </sch:report>
206
+ </sch:rule>
207
+ </sch:pattern>
208
+
209
+ <sch:pattern>
210
+ <xsl:comment>
211
+ This pattern validates that calibration end date is not before the beginning date.
212
+ </xsl:comment>
213
+
214
+ <sch:rule context="dcc:coreData/dcc:endPerformanceDate">
215
+ <sch:let name="eDate" value="xs:date(.)"/>
216
+ <sch:let name="bDate" value="xs:date(../dcc:beginPerformanceDate)"/>
217
+ <sch:assert role="error" test="$bDate le $eDate">
218
+ Invalid date range: The calibration end date (<sch:value-of select="."/>) cannot be before the beginning
219
+ date (<sch:value-of select="../dcc:beginPerformanceDate"/>).
220
+ </sch:assert>
221
+ </sch:rule>
222
+ </sch:pattern>
223
+
224
+ <sch:pattern>
225
+ <xsl:comment>
226
+ This pattern validates the format of software release version numbers.
227
+ </xsl:comment>
228
+
229
+ <sch:rule context="//dcc:release">
230
+ <sch:assert role="error" test="(matches(text(), '^[a-zA-Z]{1}( )?([0-9]{1,3}\.){0,3}([0-9]{1,3})$'))">
231
+ Invalid release version format: The release version '<sch:value-of select="text()"/>' for software '
232
+ <sch:value-of select="preceding-sibling::dcc:name[1]/dcc:content[1]/text()"/>' does not follow the
233
+ required format (e.g., 'v1.2.3' or 'A 1.0').
234
+ </sch:assert>
235
+ </sch:rule>
236
+ </sch:pattern>
237
+
238
+ <sch:pattern>
239
+ <xsl:comment>
240
+ This pattern validates ISO language and country codes against standard lists.
241
+ </xsl:comment>
242
+
243
+ <sch:let name="lc"
244
+ value="string-join(('aa', 'ab', 'ae', 'af', 'ak', 'am', 'an', 'ar', 'as', 'av', 'ay', 'az', 'ba', 'be', 'bg', 'bi', 'bm', 'bn', 'bo', 'br', 'bs', 'ca', 'ce', 'ch', 'co', 'cr', 'cs', 'cu', 'cv', 'cy', 'da', 'de', 'dv', 'dz', 'ee', 'el', 'en', 'eo', 'es', 'et', 'eu', 'fa', 'ff', 'fi', 'fj', 'fo', 'fr', 'fy', 'ga', 'gd', 'gl', 'gn', 'gu', 'gv', 'ha', 'he', 'hi', 'ho', 'hr', 'ht', 'hu', 'hy', 'hz', 'ia', 'id', 'ie', 'ig', 'ii', 'ik', 'io', 'is', 'it', 'iu', 'ja', 'jv', 'ka', 'kg', 'ki', 'kj', 'kk', 'kl', 'km', 'kn', 'ko', 'kr', 'ks', 'ku', 'kv', 'kw', 'ky', 'la', 'lb', 'lg', 'li', 'ln', 'lo', 'lt', 'lu', 'lv', 'mg', 'mh', 'mi', 'mk', 'ml', 'mn', 'mr', 'ms', 'mt', 'my', 'na', 'nb', 'nd', 'ne', 'ng', 'nl', 'nn', 'no', 'nr', 'nv', 'ny', 'oc', 'oj', 'om', 'or', 'os', 'pa', 'pi', 'pl', 'ps', 'pt', 'qu', 'rm', 'rn', 'ro', 'ru', 'rw', 'sa', 'sc', 'sd', 'se', 'sg', 'si', 'sk', 'sl', 'sm', 'sn', 'so', 'sq', 'sr', 'ss', 'st', 'su', 'sv', 'sw', 'ta', 'te', 'tg', 'th', 'ti', 'tk', 'tl', 'tn', 'to', 'tr', 'ts', 'tt', 'tw', 'ty', 'ug', 'uk', 'ur', 'uz', 've', 'vi', 'vo', 'wa', 'wo', 'xh', 'yi', 'yo', 'za', 'zh', 'zu'), ' ')"/>
245
+
246
+ <sch:rule context="//dcc:usedLangCodeISO639_1">
247
+ <sch:assert role="error" test="contains($lc, text())">
248
+ Invalid ISO 639-1 language code: '<sch:value-of select="text()"/>' is not a valid language code
249
+ according to the ISO 639-1 standard.
250
+ </sch:assert>
251
+ </sch:rule>
252
+
253
+ <sch:rule context="//dcc:mandatoryLangCodeISO639_1">
254
+ <sch:assert role="error" test="contains($lc, text())">
255
+ Invalid ISO 639-1 language code: '<sch:value-of select="text()"/>' is not a valid language code
256
+ according to the ISO 639-1 standard.
257
+ </sch:assert>
258
+ </sch:rule>
259
+
260
+ <sch:rule context="//dcc:countryCodeISO3166_1">
261
+ <sch:let name="cc"
262
+ value="string-join(('AD', 'AO', 'AI', 'AQ', 'AG', 'AR', 'AM', 'AW', 'AU', 'AT', 'AZ', 'BS', 'BH', 'BD', 'BB', 'BY', 'BE', 'BZ', 'BJ', 'BM', 'BT', 'BO', 'BQ', 'BA', 'BW', 'BV', 'BR', 'IO', 'BN', 'BG', 'BF', 'BI', 'CV', 'KH', 'CM', 'CA', 'KY', 'CF', 'TD', 'CL', 'CN', 'CX', 'CC', 'CO', 'KM', 'CD', 'CG', 'CK', 'CR', 'CI', 'HR', 'CU', 'CW', 'CY', 'CZ', 'DE', 'DK', 'DJ', 'DM', 'DO', 'EC', 'EG', 'SV', 'GQ', 'ER', 'EE', 'SZ', 'ET', 'FK', 'FO', 'FJ', 'FI', 'FR', 'GF', 'PF', 'TF', 'GA', 'GM', 'GE', 'DE', 'GH', 'GI', 'GR', 'GL', 'GD', 'GP', 'GU', 'GT', 'GG', 'GN', 'GW', 'GY', 'HT', 'HM', 'VA', 'HN', 'HK', 'HU', 'IS', 'IN', 'ID', 'IR', 'IQ', 'IE', 'IM', 'IL', 'IT', 'JM', 'JP', 'JE', 'JO', 'KZ', 'KE', 'KI', 'KP', 'KR', 'KW', 'KG', 'LA', 'LV', 'LB', 'LS', 'LR', 'LY', 'LI', 'LT', 'LU', 'MO', 'MK', 'MG', 'MW', 'MY', 'MV', 'ML', 'MT', 'MH', 'MQ', 'MR', 'MU', 'YT', 'MX', 'FM', 'MD', 'MC', 'MN', 'ME', 'MS', 'MA', 'MZ', 'MM', 'NA', 'NR', 'NP', 'NL', 'NC', 'NZ', 'NI', 'NE', 'NG', 'NU', 'NF', 'MP', 'NO', 'OM', 'PK', 'PW', 'PS', 'PA', 'PG', 'PY', 'PE', 'PH', 'PN', 'PL', 'PT', 'PR', 'QA', 'RE', 'RO', 'RU', 'RW', 'BL', 'SH', 'KN', 'LC', 'MF', 'PM', 'VC', 'WS', 'SM', 'ST', 'SA', 'SN', 'RS', 'SC', 'SL', 'SG', 'SX', 'SK', 'SI', 'SB', 'SO', 'ZA', 'GS', 'SS', 'ES', 'LK', 'SD', 'SR', 'SJ', 'SE', 'CH', 'SY', 'TW', 'TJ', 'TZ', 'TH', 'TL', 'TG', 'TK', 'TO', 'TT', 'TN', 'TR', 'TM', 'TC', 'TV', 'UG', 'UA', 'AE', 'GB', 'UM', 'US', 'UY', 'UZ', 'VU', 'VE', 'VN', 'VG', 'VI', 'WF', 'EH', 'YE', 'ZM', 'ZW'), ' ')"/>
263
+
264
+ <sch:assert role="error" test="contains($cc, text())">
265
+ Invalid ISO 3166-1 country code: '<sch:value-of select="text()"/>' is not a valid country code according
266
+ to the ISO 3166-1 standard.
267
+ </sch:assert>
268
+ </sch:rule>
269
+ </sch:pattern>
270
+
271
+ <sch:pattern>
272
+ <xsl:comment>
273
+ This pattern validates relative uncertainty values and their relationships with expanded uncertainty.
274
+ </xsl:comment>
275
+
276
+ <sch:rule context="//dcc:quantity">
277
+ <sch:let name="valueXMLList" value="si:realListXMLList/si:valueXMLList"/>
278
+ <sch:let name="relativeUncertaintyXmlList"
279
+ value="dcc:relativeUncertainty/dcc:relativeUncertaintyXmlList/si:valueXMLList"/>
280
+ <sch:let name="uncertaintyXMLList" value="si:realListXMLList/si:expandedUncXMLList/si:uncertaintyXMLList"/>
281
+
282
+ <sch:let name="value" value="si:real/si:value"/>
283
+ <sch:let name="relativeUncertainty" value="dcc:relativeUncertainty/dcc:relativeUncertainty/si:value"/>
284
+ <sch:let name="uncertainty" value="si:real/si:expandedUnc/si:uncertainty"/>
285
+
286
+ <sch:report role="error"
287
+ test="count(dcc:relativeUncertainty/dcc:relativeUncertaintyXmlList)=1 and count(si:realListXMLList/si:expandedUncXMLList)=0">
288
+ Missing expanded uncertainty: Relative uncertainty is provided but corresponding expanded uncertainty is
289
+ missing.
290
+ </sch:report>
291
+ <sch:report role="error"
292
+ test="count(dcc:relativeUncertainty/dcc:relativeUncertainty)=1 and count(si:real/si:expandedUnc)=0">
293
+ Missing expanded uncertainty: Relative uncertainty is provided but corresponding expanded uncertainty is
294
+ missing.
295
+ </sch:report>
296
+
297
+ <sch:report role="error"
298
+ test="count(dcc:relativeUncertainty/dcc:relativeUncertaintyXmlList)=0 and count(dcc:relativeUncertainty/dcc:relativeUncertainty)=1 and count(si:realListXMLList/si:valueXMLList)=1 and count(si:real/si:value)=0">
299
+ Inconsistent data format: Value list requires relative uncertainty list, not single relative uncertainty
300
+ value.
301
+ </sch:report>
302
+ <sch:report role="error"
303
+ test="count(dcc:relativeUncertainty/dcc:relativeUncertaintyXmlList)=1 and count(dcc:relativeUncertainty/dcc:relativeUncertainty)=0 and count(si:realListXMLList/si:valueXMLList)=0 and count(si:real/si:value)=1">
304
+ Inconsistent data format: Single value requires single relative uncertainty, not relative uncertainty
305
+ list.
306
+ </sch:report>
307
+
308
+ <sch:report role="error"
309
+ test="($relativeUncertainty) != ($uncertainty) div ($value) and count(dcc:relativeUncertainty/dcc:relativeUncertainty/si:value) = 1">
310
+ Incorrect relative uncertainty calculation: The relative uncertainty value (<sch:value-of
311
+ select="$relativeUncertainty"/>) does not match the calculation (uncertainty/value =<sch:value-of
312
+ select="$uncertainty div $value"/>).
313
+ </sch:report>
314
+ </sch:rule>
315
+
316
+ <sch:rule context="//dcc:relativeUncertainty">
317
+ <sch:let name="relativeUncertaintyXmlList" value="dcc:relativeUncertaintyXmlList/si:valueXMLList"/>
318
+ <sch:let name="valueXMLList" value="preceding-sibling::si:realListXMLList/si:valueXMLList"/>
319
+
320
+ <sch:report role="error"
321
+ test="(count(tokenize($valueXMLList, ' ')) != count(tokenize($relativeUncertaintyXmlList, ' '))) and (count(tokenize($relativeUncertaintyXmlList, ' ')) > 1)">
322
+ Count mismatch: The number of relative uncertainty values (<sch:value-of
323
+ select="count(tokenize($relativeUncertaintyXmlList, ' '))"/>) must match the number of measurement
324
+ values (<sch:value-of select="count(tokenize($valueXMLList, ' '))"/>) when not using a constant
325
+ uncertainty.
326
+ </sch:report>
327
+ </sch:rule>
328
+
329
+ <sch:rule context="//si:realListXMLList">
330
+ <sch:let name="uncertaintyXMLList" value="si:expandedUncXMLList/si:uncertaintyXMLList"/>
331
+ <sch:let name="valueXMLList" value="si:valueXMLList"/>
332
+
333
+ <sch:report role="error"
334
+ test="(count(tokenize($valueXMLList, ' ')) != count(tokenize($uncertaintyXMLList, ' '))) and (count(tokenize($uncertaintyXMLList, ' ')) > 1) and count(si:expandedUncXMLList/si:uncertaintyXMLList)=1">
335
+ Count mismatch: The number of expanded uncertainty values (<sch:value-of
336
+ select="count(tokenize($uncertaintyXMLList, ' '))"/>) must match the number of measurement values (
337
+ <sch:value-of select="count(tokenize($valueXMLList, ' '))"/>) when not using constant uncertainty.
338
+ </sch:report>
339
+ </sch:rule>
340
+ </sch:pattern>
341
+
342
+ <sch:pattern>
343
+ <xsl:comment>
344
+ This pattern validates units and unit lists to ensure proper formatting and consistency.
345
+ </xsl:comment>
346
+
347
+ <sch:rule context="//si:real/si:unit">
348
+ <sch:report role="error" test="count(tokenize(., ' ')) > 1">
349
+ Invalid unit format: Units cannot contain spaces. Found '<sch:value-of select="."/>'.
350
+ </sch:report>
351
+ </sch:rule>
352
+ <sch:rule context="//si:unitXMLList">
353
+ <sch:report role="error"
354
+ test="count(tokenize(., ' ')) > 1 and not(count(tokenize(., ' ')) = count(tokenize(preceding-sibling::si:valueXMLList)))">
355
+ Unit count mismatch: If units vary across values, you must provide a unit for each value. Found
356
+ <sch:value-of select="count(tokenize(., ' '))"/>
357
+ units for
358
+ <sch:value-of select="count(tokenize(preceding-sibling::si:valueXMLList, ' '))"/>
359
+ values.
360
+ </sch:report>
361
+ <sch:report role="warning"
362
+ test="count(tokenize(., ' ')) > 1 and (every $value in tokenize(., ' ') satisfies ($value = tokenize(., ' ')))">
363
+ Redundant unit specification: All units in the list are identical ('<sch:value-of
364
+ select="tokenize(., ' ')[1]"/>'). Consider using a single unit declaration for better clarity.
365
+ </sch:report>
366
+ </sch:rule>
367
+ </sch:pattern>
368
+
369
+ <sch:pattern>
370
+ <xsl:comment>
371
+ This pattern validates that non-SI units are properly declared before use.
372
+ </xsl:comment>
373
+
374
+ <sch:let name="nonSI" value="//dcc:statement/dcc:nonSIUnit"/>
375
+ <sch:rule context="//si:hybrid/si:real/si:unit">
376
+ <sch:report role="error" test="not(text()=$nonSI) and matches(text(), '^\|.+')">
377
+ Undeclared non-SI unit: The unit '<sch:value-of select="text()"/>' appears to be a non-SI unit but is
378
+ not declared in the dcc:nonSIUnit statements.
379
+ </sch:report>
380
+ </sch:rule>
381
+
382
+ <sch:rule context="//dcc:nonSIUnit">
383
+ <sch:assert role="error" test="count(preceding-sibling::dcc:nonSIDefinition)=1">
384
+ Missing non-SI unit definition: The non-SI unit '<sch:value-of select="text()"/>' must have a
385
+ corresponding definition in dcc:nonSIDefinition.
386
+ </sch:assert>
387
+ </sch:rule>
388
+
389
+ <sch:rule context="//dcc:nonSIDefinition">
390
+ <sch:assert role="error" test="count(following-sibling::dcc:nonSIUnit)=1">
391
+ Missing non-SI unit declaration: The non-SI unit definition must have a corresponding unit declaration
392
+ in dcc:nonSIUnit.
393
+ </sch:assert>
394
+ </sch:rule>
395
+ </sch:pattern>
396
+
397
+ <sch:pattern>
398
+ <xsl:comment>
399
+ This pattern validates that language codes are not declared multiple times.
400
+ </xsl:comment>
401
+
402
+ <sch:rule context="dcc:usedLangCodeISO639_1">
403
+ <sch:report role="error"
404
+ test="text()=preceding-sibling::dcc:usedLangCodeISO639_1/text() or text()=following-sibling::dcc:usedLangCodeISO639_1/text()">
405
+ Duplicate language code: The language code '<sch:value-of select="text()"/>' is declared multiple times.
406
+ Each language code may only be declared once.
407
+ </sch:report>
408
+ </sch:rule>
409
+ </sch:pattern>
410
+
411
+ <sch:pattern>
412
+ <xsl:comment>
413
+ This pattern validates XML list formatting to ensure proper spacing between entries.
414
+ XML lists must contain exactly one space between entries, no leading/trailing spaces, and no multiple
415
+ consecutive spaces.
416
+ </xsl:comment>
417
+
418
+ <sch:rule context="//si:valueXMLList">
419
+ <sch:assert role="error" test="(matches(., '^([^\s]+\s)*([^\s]+)$'))">
420
+ Invalid list formatting: XML list contains improper spacing. Ensure exactly one space separates entries
421
+ with no leading/trailing spaces.
422
+ </sch:assert>
423
+ </sch:rule>
424
+
425
+ <sch:rule context="//si:unitXMLList">
426
+ <sch:assert role="error" test="(matches(., '^([^\s]+\s)*([^\s]+)$'))">
427
+ Invalid list formatting: Unit XML list contains improper spacing. Ensure exactly one space separates
428
+ entries with no leading/trailing spaces.
429
+ </sch:assert>
430
+ </sch:rule>
431
+
432
+ <sch:rule context="//si:labelXMLList">
433
+ <sch:assert role="error" test="(matches(., '^([^\s]+\s)*([^\s]+)$'))">
434
+ Invalid list formatting: Label XML list contains improper spacing. Ensure exactly one space separates
435
+ entries with no leading/trailing spaces.
436
+ </sch:assert>
437
+ </sch:rule>
438
+
439
+ <sch:rule context="//si:dateTimeXMLList">
440
+ <sch:assert role="error" test="(matches(., '^([^\s]+\s)*([^\s]+)$'))">
441
+ Invalid list formatting: DateTime XML list contains improper spacing. Ensure exactly one space separates
442
+ entries with no leading/trailing spaces.
443
+ </sch:assert>
444
+ </sch:rule>
445
+
446
+ <sch:rule context="//si:uncertaintyXMLList">
447
+ <sch:assert role="error" test="(matches(., '^([^\s]+\s)*([^\s]+)$'))">
448
+ Invalid list formatting: Uncertainty XML list contains improper spacing. Ensure exactly one space
449
+ separates entries with no leading/trailing spaces.
450
+ </sch:assert>
451
+ </sch:rule>
452
+
453
+ <sch:rule context="//si:coverageFactorXMLList">
454
+ <sch:assert role="error" test="(matches(., '^([^\s]+\s)*([^\s]+)$'))">
455
+ Invalid list formatting: Coverage factor XML list contains improper spacing. Ensure exactly one space
456
+ separates entries with no leading/trailing spaces.
457
+ </sch:assert>
458
+ </sch:rule>
459
+
460
+ <sch:rule context="//si:coverageProbabilityXMLList">
461
+ <sch:assert role="error" test="(matches(., '^([^\s]+\s)*([^\s]+)$'))">
462
+ Invalid list formatting: Coverage probability XML list contains improper spacing. Ensure exactly one
463
+ space separates entries with no leading/trailing spaces.
464
+ </sch:assert>
465
+ </sch:rule>
466
+
467
+ <sch:rule context="//si:distributionXMLList">
468
+ <sch:assert role="error" test="(matches(., '^([^\s]+\s)*([^\s]+)$'))">
469
+ Invalid list formatting: Distribution XML list contains improper spacing. Ensure exactly one space
470
+ separates entries with no leading/trailing spaces.
471
+ </sch:assert>
472
+ </sch:rule>
473
+
474
+ <sch:rule context="//si:standardUncXMLList">
475
+ <sch:assert role="error" test="(matches(., '^([^\s]+\s)*([^\s]+)$'))">
476
+ Invalid list formatting: Standard uncertainty XML list contains improper spacing. Ensure exactly one
477
+ space separates entries with no leading/trailing spaces.
478
+ </sch:assert>
479
+ </sch:rule>
480
+
481
+ <sch:rule context="//si:intervalMinXMLList">
482
+ <sch:assert role="error" test="(matches(., '^([^\s]+\s)*([^\s]+)$'))">
483
+ Invalid list formatting: Interval minimum XML list contains improper spacing. Ensure exactly one space
484
+ separates entries with no leading/trailing spaces.
485
+ </sch:assert>
486
+ </sch:rule>
487
+
488
+ <sch:rule context="//si:intervalMaxXMLList">
489
+ <sch:assert role="error" test="(matches(., '^([^\s]+\s)*([^\s]+)$'))">
490
+ Invalid list formatting: Interval maximum XML list contains improper spacing. Ensure exactly one space
491
+ separates entries with no leading/trailing spaces.
492
+ </sch:assert>
493
+ </sch:rule>
494
+
495
+ <sch:rule context="//dcc:dateTimeXMLListType">
496
+ <sch:assert role="error" test="(matches(., '^([^\s]+\s)*([^\s]+)$'))">
497
+ Invalid list formatting: DateTime list contains improper spacing. Ensure exactly one space separates
498
+ entries with no leading/trailing spaces.
499
+ </sch:assert>
500
+ </sch:rule>
501
+
502
+ <sch:rule context="//dcc:stringConformityStatementStatusXMLListType">
503
+ <sch:assert role="error" test="(matches(., '^([^\s]+\s)*([^\s]+)$'))">
504
+ Invalid list formatting: Conformity statement status list contains improper spacing. Ensure exactly one
505
+ space separates entries with no leading/trailing spaces.
506
+ </sch:assert>
507
+ </sch:rule>
508
+
509
+ <sch:rule context="//@refType">
510
+ <sch:assert role="error" test="(matches(., '^([^\s]+\s)*([^\s]+)$'))">
511
+ Invalid attribute formatting: The refType attribute '<sch:value-of select="."/>' contains improper
512
+ spacing. Ensure exactly one space separates entries with no leading/trailing spaces.
513
+ </sch:assert>
514
+ </sch:rule>
515
+
516
+ <sch:rule context="//@refId">
517
+ <sch:assert role="error" test="(matches(., '^([^\s]+\s)*([^\s]+)$'))">
518
+ Invalid attribute formatting: The refId attribute '<sch:value-of select="."/>' contains improper
519
+ spacing. Ensure exactly one space separates entries with no leading/trailing spaces.
520
+ </sch:assert>
521
+ </sch:rule>
522
+ </sch:pattern>
523
+ </sch:schema>