metanorma-standoc 1.7.3 → 1.8.1

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 (41) hide show
  1. checksums.yaml +4 -4
  2. data/lib/asciidoctor/standoc/base.rb +31 -44
  3. data/lib/asciidoctor/standoc/basicdoc.rng +5 -3
  4. data/lib/asciidoctor/standoc/blocks.rb +7 -7
  5. data/lib/asciidoctor/standoc/blocks_notes.rb +2 -2
  6. data/lib/asciidoctor/standoc/cleanup.rb +5 -6
  7. data/lib/asciidoctor/standoc/cleanup_block.rb +3 -3
  8. data/lib/asciidoctor/standoc/cleanup_boilerplate.rb +56 -0
  9. data/lib/asciidoctor/standoc/cleanup_inline.rb +22 -26
  10. data/lib/asciidoctor/standoc/cleanup_ref.rb +0 -85
  11. data/lib/asciidoctor/standoc/cleanup_ref_dl.rb +94 -0
  12. data/lib/asciidoctor/standoc/converter.rb +0 -1
  13. data/lib/asciidoctor/standoc/front.rb +2 -2
  14. data/lib/asciidoctor/standoc/inline.rb +1 -1
  15. data/lib/asciidoctor/standoc/isodoc.rng +3 -0
  16. data/lib/asciidoctor/standoc/lists.rb +2 -2
  17. data/lib/asciidoctor/standoc/macros_plantuml.rb +1 -1
  18. data/lib/asciidoctor/standoc/ref_sect.rb +2 -2
  19. data/lib/asciidoctor/standoc/reqt.rb +6 -1
  20. data/lib/asciidoctor/standoc/section.rb +3 -80
  21. data/lib/asciidoctor/standoc/table.rb +1 -1
  22. data/lib/asciidoctor/standoc/terms.rb +125 -0
  23. data/lib/asciidoctor/standoc/utils.rb +2 -96
  24. data/lib/metanorma/standoc/version.rb +1 -1
  25. data/metanorma-standoc.gemspec +2 -2
  26. data/spec/asciidoctor-standoc/base_spec.rb +30 -1
  27. data/spec/asciidoctor-standoc/cleanup_spec.rb +111 -2
  28. data/spec/asciidoctor-standoc/isobib_cache_spec.rb +4 -4
  29. data/spec/asciidoctor-standoc/refs_dl_spec.rb +13 -1
  30. data/spec/asciidoctor-standoc/refs_spec.rb +12 -12
  31. data/spec/asciidoctor-standoc/section_spec.rb +5 -3
  32. data/spec/vcr_cassettes/dated_iso_ref_joint_iso_iec.yml +47 -47
  33. data/spec/vcr_cassettes/isobib_get_123.yml +11 -11
  34. data/spec/vcr_cassettes/isobib_get_123_1.yml +26 -26
  35. data/spec/vcr_cassettes/isobib_get_123_1_fr.yml +36 -36
  36. data/spec/vcr_cassettes/isobib_get_123_2001.yml +14 -14
  37. data/spec/vcr_cassettes/isobib_get_124.yml +14 -14
  38. data/spec/vcr_cassettes/rfcbib_get_rfc8341.yml +8 -8
  39. data/spec/vcr_cassettes/separates_iev_citations_by_top_level_clause.yml +45 -45
  40. metadata +19 -18
  41. data/lib/asciidoctor/standoc/log.rb +0 -59
@@ -5,105 +5,11 @@ require "json"
5
5
  require "pathname"
6
6
  require "open-uri"
7
7
  require "uuidtools"
8
- require "sterile"
9
8
  require "mimemagic"
10
9
 
11
10
  module Asciidoctor
12
11
  module Standoc
13
12
  module Utils
14
- class << self
15
- def anchor_or_uuid(node = nil)
16
- uuid = UUIDTools::UUID.random_create
17
- node.nil? || node.id.nil? || node.id.empty? ? "_" + uuid : node.id
18
- end
19
-
20
- def asciidoc_sub(x)
21
- return nil if x.nil?
22
- return "" if x.empty?
23
- d = Asciidoctor::Document.new(x.lines.entries, { header_footer: false,
24
- backend: :standoc })
25
- b = d.parse.blocks.first
26
- b.apply_subs(b.source)
27
- end
28
-
29
- def localdir(node)
30
- docfile = node.attr("docfile")
31
- docfile.nil? ? './' : Pathname.new(docfile).parent.to_s + '/'
32
- end
33
-
34
- # TODO needs internationalisation
35
- def smartformat(n)
36
- n.gsub(/ --? /, "&#8201;&#8212;&#8201;").
37
- gsub(/\'(\d\d)(?=[^\u2019\'\s<]+[’\'][\p{P}\p{Z}])([\p{P}\p{Z}])/, "\u2018\\1\\2").
38
- gsub(/--/, "&#8212;").smart_format.gsub(/</, "&lt;").gsub(/>/, "&gt;")
39
- end
40
-
41
- def endash_date(elem)
42
- elem.traverse do |n|
43
- n.text? and n.replace(n.text.gsub(/\s+--?\s+/, "&#8211;").gsub(/--/, "&#8211;"))
44
- end
45
- end
46
-
47
- # Set hash value using keys path
48
- # mod from https://stackoverflow.com/a/42425884
49
- def set_nested_value(hash, keys, new_val)
50
- key = keys[0]
51
- if keys.length == 1
52
- hash[key] = hash[key].is_a?(Array) ? (hash[key] << new_val) :
53
- hash[key].nil? ? new_val : [hash[key], new_val]
54
- return hash
55
- end
56
- if hash[key].is_a?(Array)
57
- hash[key][-1] = {} if hash[key][-1].nil?
58
- set_nested_value(hash[key][-1], keys[1..-1], new_val)
59
- elsif hash[key].nil? || hash[key].empty?
60
- hash[key] = {}
61
- set_nested_value(hash[key], keys[1..-1], new_val)
62
- elsif hash[key].is_a?(Hash) && !hash[key][keys[1]]
63
- set_nested_value(hash[key], keys[1..-1], new_val)
64
- elsif !hash[key][keys[1]]
65
- hash[key] = [hash[key], {}]
66
- set_nested_value(hash[key][-1], keys[1..-1], new_val)
67
- else
68
- set_nested_value(hash[key], keys[1..-1], new_val)
69
- end
70
- end
71
-
72
- def flatten_rawtext_lines(node, result)
73
- node.lines.each do |x|
74
- if node.respond_to?(:context) && (node.context == :literal ||
75
- node.context == :listing)
76
- result << x.gsub(/</, "&lt;").gsub(/>/, "&gt;")
77
- else
78
- # strip not only HTML <tag>, and Asciidoc xrefs <<xref>>
79
- result << x.gsub(/<[^>]*>+/, "")
80
- end
81
- end
82
- result
83
- end
84
-
85
- # if node contains blocks, flatten them into a single line;
86
- # and extract only raw text
87
- def flatten_rawtext(node)
88
- result = []
89
- if node.respond_to?(:blocks) && node.blocks?
90
- node.blocks.each { |b| result << flatten_rawtext(b) }
91
- elsif node.respond_to?(:lines)
92
- result = flatten_rawtext_lines(node, result)
93
- elsif node.respond_to?(:text)
94
- result << node.text.gsub(/<[^>]*>+/, "")
95
- else
96
- result << node.content.gsub(/<[^>]*>+/, "")
97
- end
98
- result.reject(&:empty?)
99
- end
100
-
101
- def reqt_subpart(x)
102
- %w(specification measurement-target verification import label
103
- subject inherit classification title).include? x
104
- end
105
- end
106
-
107
13
  def convert(node, transform = nil, opts = {})
108
14
  transform ||= node.node_name
109
15
  opts.empty? ? (send transform, node) : (send transform, node, opts)
@@ -177,14 +83,14 @@ module Asciidoctor
177
83
  SUBCLAUSE_XPATH = "//clause[not(parent::sections)]"\
178
84
  "[not(ancestor::boilerplate)]".freeze
179
85
 
180
- def isodoc(lang, script, i18nyaml = nil)
86
+ def isodoc(lang, script, i18nyaml = nil)
181
87
  conv = html_converter(EmptyAttr.new)
182
88
  i18n = conv.i18n_init(lang, script, i18nyaml)
183
89
  conv.metadata_init(lang, script, i18n)
184
90
  conv
185
91
  end
186
92
 
187
- class EmptyAttr
93
+ class EmptyAttr
188
94
  def attr(_x)
189
95
  nil
190
96
  end
@@ -19,6 +19,6 @@ module Metanorma
19
19
  end
20
20
 
21
21
  module Standoc
22
- VERSION = "1.7.3".freeze
22
+ VERSION= "1.8.1".freeze
23
23
  end
24
24
  end
@@ -28,16 +28,16 @@ Gem::Specification.new do |spec|
28
28
 
29
29
  spec.add_dependency "asciidoctor", "~> 2.0.0"
30
30
  spec.add_dependency "ruby-jing"
31
- spec.add_dependency "isodoc", "~> 1.4.2"
31
+ spec.add_dependency "isodoc", "~> 1.5.0"
32
32
  spec.add_dependency "iev", "~> 0.2.1"
33
33
  spec.add_dependency "metanorma-plugin-datastruct"
34
34
  spec.add_dependency "metanorma-plugin-lutaml", "~> 0.2.1"
35
35
  # relaton-cli not just relaton, to avoid circular reference in metanorma
36
36
  spec.add_dependency "relaton-cli", "~> 1.7.0"
37
37
  spec.add_dependency "relaton-iev", "~> 1.1.0"
38
- spec.add_dependency "sterile", "~> 1.0.14"
39
38
  spec.add_dependency "concurrent-ruby"
40
39
  spec.add_dependency "unicode2latex", "~> 0.0.1"
40
+ spec.add_dependency "metanorma-utils", "~> 1"
41
41
  spec.add_dependency "mimemagic"
42
42
  spec.add_dependency "mathml2asciimath"
43
43
  spec.add_dependency "latexmath"
@@ -32,7 +32,36 @@ RSpec.describe Asciidoctor::Standoc do
32
32
  expect(File.exist?("htmlstyle.css")).to be false
33
33
  end
34
34
 
35
- it "processes publisher abbreviations" do
35
+ it "assigns default scripts to major languages" do
36
+ FileUtils.rm_f "test.doc"
37
+ expect(xmlpp(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true))).to be_equivalent_to xmlpp(<<~"OUTPUT")
38
+ = Document title
39
+ Author
40
+ :docfile: test.adoc
41
+ :novalid:
42
+ :language: ar
43
+ INPUT
44
+ <standard-document xmlns='https://www.metanorma.org/ns/standoc' type='semantic' version='#{Metanorma::Standoc::VERSION}'>
45
+ <bibdata type='standard'>
46
+ <title language='en' format='text/plain'>Document title</title>
47
+ <language>ar</language>
48
+ <script>Arab</script>
49
+ <status>
50
+ <stage>published</stage>
51
+ </status>
52
+ <copyright>
53
+ <from>2021</from>
54
+ </copyright>
55
+ <ext>
56
+ <doctype>article</doctype>
57
+ </ext>
58
+ </bibdata>
59
+ <sections> </sections>
60
+ </standard-document>
61
+ OUTPUT
62
+ end
63
+
64
+ it "processes publisher abbreviations" do
36
65
  mock_org_abbrevs
37
66
  expect(xmlpp(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true))).to be_equivalent_to xmlpp(<<~"OUTPUT")
38
67
  = Document title
@@ -1867,6 +1867,8 @@ input = <<~INPUT
1867
1867
  <<1:>>
1868
1868
  <<1#b>>
1869
1869
  <<:a#b:>>
1870
+ <</%ab>>
1871
+ <<1!>>
1870
1872
 
1871
1873
  INPUT
1872
1874
  expect(xmlpp(Asciidoctor.convert(input, backend: :standoc, header_footer: true).gsub(/<p id="_[^"]+">/, "").gsub('</p>', ""))).to be_equivalent_to (<<~"OUTPUT")
@@ -1888,18 +1890,27 @@ expect(xmlpp(Asciidoctor.convert(input, backend: :standoc, header_footer: true).
1888
1890
  <sections>
1889
1891
  <clause id='a_b' inline-header='false' obligation='normative'>
1890
1892
  <title>A</title>
1891
- <xref target='__ab'/>
1893
+ <eref bibitemid='__ab' citeas=''/>
1892
1894
  <xref target='_'/>
1893
1895
  <xref target='_1'/>
1894
1896
  <xref target='_1_'/>
1895
1897
  <xref target='1#b'/>
1896
1898
  <xref target='_a#b_'/>
1899
+ <xref target='_%ab'/>
1900
+ <xref target='_1_'/>
1897
1901
  </clause>
1898
1902
  </sections>
1903
+ <bibliography>
1904
+ <references hidden='true' normative='false'>
1905
+ <bibitem id='__ab' type='internal'>
1906
+ <docidentifier type='repository'>//ab</docidentifier>
1907
+ </bibitem>
1908
+ </references>
1909
+ </bibliography>
1899
1910
  </standard-document>
1900
1911
  OUTPUT
1901
1912
  expect{Asciidoctor.convert(input, backend: :standoc, header_footer: true)}.to output(%r{normalised identifier in <clause id="a_b" inline-header="false" obligation="normative"/> from a:b}).to_stderr
1902
- expect{Asciidoctor.convert(input, backend: :standoc, header_footer: true)}.to output(%r{normalised identifier in <xref target="__ab"/> from /:ab}).to_stderr
1913
+ expect{Asciidoctor.convert(input, backend: :standoc, header_footer: true)}.to output(%r{normalised identifier in <eref bibitemid="__ab" citeas=""/> from /_ab}).to_stderr
1903
1914
  expect{Asciidoctor.convert(input, backend: :standoc, header_footer: true)}.to output(%r{normalised identifier in <xref target="_"/> from :}).to_stderr
1904
1915
  expect{Asciidoctor.convert(input, backend: :standoc, header_footer: true)}.to output(%r{normalised identifier in <xref target="_1"/> from 1}).to_stderr
1905
1916
  expect{Asciidoctor.convert(input, backend: :standoc, header_footer: true)}.to output(%r{normalised identifier in <xref target="_1_"/> from 1:}).to_stderr
@@ -2109,6 +2120,104 @@ mock_mathml_italicise({ uppergreek: true, upperroman: true, lowergreek: true, lo
2109
2120
 
2110
2121
  end
2111
2122
 
2123
+ it "process express_ref macro with existing bibliography" do
2124
+ expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true, agree_to_terms: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
2125
+ #{ASCIIDOC_BLANK_HDR}
2126
+ == Clause
2127
+
2128
+ <<uml:A:A.B.C,C>>
2129
+ <<uml:A>>
2130
+ <<express-schema:action:action.AA,AA>>
2131
+ <<express-schema:action:action.AB>>
2132
+
2133
+ [[action]]
2134
+ [type="express-schema"]
2135
+ == Action
2136
+
2137
+ [[action.AA]]
2138
+ === AA
2139
+
2140
+ [bibliography]
2141
+ == Bibliography
2142
+ * [[[D,E]]] F
2143
+ INPUT
2144
+ #{BLANK_HDR}
2145
+ <sections>
2146
+ <clause id='_' inline-header='false' obligation='normative'>
2147
+ <title>Clause</title>
2148
+ <p id='_'>
2149
+ <eref bibitemid='uml_A' citeas="">
2150
+ <localityStack>
2151
+ <locality type='anchor'><referenceFrom>A.B.C</referenceFrom></locality>
2152
+ </localityStack>
2153
+ C
2154
+ </eref>
2155
+ <eref bibitemid='uml_A' citeas=""/>
2156
+ <xref target='action.AA'>AA</xref>
2157
+ <xref target='action'>** Missing target action.AB</xref>
2158
+ </p>
2159
+ </clause>
2160
+ <clause id='action' type='express-schema' inline-header='false' obligation='normative'>
2161
+ <title>Action</title>
2162
+ <clause id='action.AA' inline-header='false' obligation='normative'>
2163
+ <title>AA</title>
2164
+ </clause>
2165
+ </clause>
2166
+ </sections>
2167
+ <bibliography>
2168
+ <references id='_' normative='false' obligation='informative'>
2169
+ <title>Bibliography</title>
2170
+ <bibitem id='D'>
2171
+ <formattedref format='application/x-isodoc+xml'>F</formattedref>
2172
+ <docidentifier>E</docidentifier>
2173
+ </bibitem>
2174
+ </references>
2175
+ <references hidden='true' normative='false'>
2176
+ <bibitem id='uml_A' type='internal'>
2177
+ <docidentifier type='repository'>uml/A</docidentifier>
2178
+ </bibitem>
2179
+ </references>
2180
+ </bibliography>
2181
+ </standard-document>
2182
+ OUTPUT
2183
+ end
2184
+
2185
+
2186
+ it "process express_ref macro with no existing bibliography" do
2187
+ expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true, agree_to_terms: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
2188
+ #{ASCIIDOC_BLANK_HDR}
2189
+ == Clause
2190
+
2191
+ <<express-schema:A:A.B.C,C>>
2192
+ <<express-schema:A>>
2193
+ INPUT
2194
+ #{BLANK_HDR}
2195
+ <sections>
2196
+ <clause id='_' inline-header='false' obligation='normative'>
2197
+ <title>Clause</title>
2198
+ <p id='_'>
2199
+ <eref bibitemid='express-schema_A' citeas="">
2200
+ <localityStack>
2201
+ <locality type='anchor'><referenceFrom>A.B.C</referenceFrom></locality>
2202
+ </localityStack>
2203
+ C
2204
+ </eref>
2205
+ <eref bibitemid='express-schema_A' citeas=""/>
2206
+ </p>
2207
+ </clause>
2208
+ </sections>
2209
+ <bibliography>
2210
+ <references hidden='true' normative='false'>
2211
+ <bibitem id='express-schema_A' type='internal'>
2212
+ <docidentifier type='repository'>express-schema/A</docidentifier>
2213
+ </bibitem>
2214
+ </references>
2215
+ </bibliography>
2216
+ </standard-document>
2217
+ OUTPUT
2218
+ end
2219
+
2220
+
2112
2221
  private
2113
2222
 
2114
2223
  def mock_mathml_italicise(x)
@@ -127,7 +127,7 @@ EOS
127
127
  <script>Latn</script>
128
128
  <status>
129
129
  <stage>90</stage>
130
- <substage>93</substage>
130
+ <substage>20</substage>
131
131
  </status>
132
132
  <copyright>
133
133
  <from>2001</from>
@@ -168,7 +168,7 @@ EOS
168
168
  <script>Latn</script>
169
169
  <status>
170
170
  <stage>90</stage>
171
- <substage>93</substage>
171
+ <substage>20</substage>
172
172
  </status>
173
173
  <copyright>
174
174
  <from>2001</from>
@@ -211,7 +211,7 @@ EOS
211
211
  <uri type="obp">https://www.iso.org/obp/ui/#!iso:std:23281:en</uri>
212
212
  <uri type="rss">https://www.iso.org/contents/data/standard/02/32/23281.detail.rss</uri>
213
213
  <docidentifier type="ISO">ISO 123:2001</docidentifier>
214
- <docidentifier type='URN'>urn:iso:std:iso:123:stage-90.93:ed-3:en</docidentifier>
214
+ <docidentifier type='URN'>urn:iso:std:iso:123:stage-90.20:ed-3:en</docidentifier>
215
215
  <docnumber>123</docnumber>
216
216
  <date type="published">
217
217
  <on>2001-05</on>
@@ -236,7 +236,7 @@ EOS
236
236
  </abstract>
237
237
  <status>
238
238
  <stage>90</stage>
239
- <substage>93</substage>
239
+ <substage>20</substage>
240
240
  </status>
241
241
  <copyright>
242
242
  <from>2001</from>
@@ -74,6 +74,11 @@ RSpec.describe Asciidoctor::Standoc do
74
74
  it "processes complex dl reference" do
75
75
  expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
76
76
  #{ASCIIDOC_BLANK_HDR}
77
+
78
+ == Clause
79
+
80
+ <<ISOTC211>>
81
+
77
82
  [bibliography]
78
83
  == Normative References
79
84
 
@@ -288,7 +293,14 @@ formattedref::
288
293
  INPUT
289
294
  #{BLANK_HDR}
290
295
  <sections>
291
- </sections><bibliography><references id="_" obligation="informative" normative="true">
296
+ <clause id='_' inline-header='false' obligation='normative'>
297
+ <title>Clause</title>
298
+ <p id='_'>
299
+ <eref type='inline' bibitemid='ISOTC211' citeas='TC211'/>
300
+ </p>
301
+ </clause>
302
+ </sections>
303
+ <bibliography><references id="_" obligation="informative" normative="true">
292
304
  <title>Normative references</title>
293
305
  #{NORM_REF_BOILERPLATE}
294
306
  <bibitem id="ISOTC211" type="standard">
@@ -264,7 +264,7 @@ RSpec.describe Asciidoctor::Standoc do
264
264
  <script>Latn</script>
265
265
  <status>
266
266
  <stage>90</stage>
267
- <substage>93</substage>
267
+ <substage>20</substage>
268
268
  </status>
269
269
  <copyright>
270
270
  <from>2001</from>
@@ -289,7 +289,7 @@ RSpec.describe Asciidoctor::Standoc do
289
289
  <uri type='obp'>https://www.iso.org/obp/ui/#!iso:std:23281:en</uri>
290
290
  <uri type='rss'>https://www.iso.org/contents/data/standard/02/32/23281.detail.rss</uri>
291
291
  <docidentifier type='ISO'>ISO 123:2001</docidentifier>
292
- <docidentifier type='URN'>urn:iso:std:iso:123:stage-90.93:ed-3:en</docidentifier>
292
+ <docidentifier type='URN'>urn:iso:std:iso:123:stage-90.20:ed-3:en</docidentifier>
293
293
  <docnumber>123</docnumber>
294
294
  <date type='published'>
295
295
  <on>2001-05</on>
@@ -314,7 +314,7 @@ RSpec.describe Asciidoctor::Standoc do
314
314
  </abstract>
315
315
  <status>
316
316
  <stage>90</stage>
317
- <substage>93</substage>
317
+ <substage>20</substage>
318
318
  </status>
319
319
  <copyright>
320
320
  <from>2001</from>
@@ -372,7 +372,7 @@ RSpec.describe Asciidoctor::Standoc do
372
372
  <script>Latn</script>
373
373
  <status>
374
374
  <stage>90</stage>
375
- <substage>93</substage>
375
+ <substage>20</substage>
376
376
  </status>
377
377
  <copyright>
378
378
  <from>2001</from>
@@ -397,7 +397,7 @@ RSpec.describe Asciidoctor::Standoc do
397
397
  <uri type='obp'>https://www.iso.org/obp/ui/#!iso:std:23281:en</uri>
398
398
  <uri type='rss'>https://www.iso.org/contents/data/standard/02/32/23281.detail.rss</uri>
399
399
  <docidentifier type='ISO'>ISO 123:2001</docidentifier>
400
- <docidentifier type='URN'>urn:iso:std:iso:123:stage-90.93:ed-3:en</docidentifier>
400
+ <docidentifier type='URN'>urn:iso:std:iso:123:stage-90.20:ed-3:en</docidentifier>
401
401
  <docnumber>123</docnumber>
402
402
  <date type='published'>
403
403
  <on>2001-05</on>
@@ -422,7 +422,7 @@ RSpec.describe Asciidoctor::Standoc do
422
422
  </abstract>
423
423
  <status>
424
424
  <stage>90</stage>
425
- <substage>93</substage>
425
+ <substage>20</substage>
426
426
  </status>
427
427
  <copyright>
428
428
  <from>2001</from>
@@ -517,7 +517,7 @@ compris les éventuels amendements).
517
517
  <script>Latn</script>
518
518
  <status>
519
519
  <stage>90</stage>
520
- <substage>93</substage>
520
+ <substage>20</substage>
521
521
  </status>
522
522
  <copyright>
523
523
  <from>2001</from>
@@ -542,7 +542,7 @@ compris les éventuels amendements).
542
542
  <uri type='obp'>https://www.iso.org/obp/ui/#!iso:std:23281:en</uri>
543
543
  <uri type='rss'>https://www.iso.org/contents/data/standard/02/32/23281.detail.rss</uri>
544
544
  <docidentifier type='ISO'>ISO 123:2001</docidentifier>
545
- <docidentifier type='URN'>urn:iso:std:iso:123:stage-90.93:ed-3:fr</docidentifier>
545
+ <docidentifier type='URN'>urn:iso:std:iso:123:stage-90.20:ed-3:fr</docidentifier>
546
546
  <docnumber>123</docnumber>
547
547
  <date type='published'>
548
548
  <on>2001-05</on>
@@ -570,7 +570,7 @@ compris les éventuels amendements).
570
570
  </abstract>
571
571
  <status>
572
572
  <stage>90</stage>
573
- <substage>93</substage>
573
+ <substage>20</substage>
574
574
  </status>
575
575
  <copyright>
576
576
  <from>2001</from>
@@ -629,7 +629,7 @@ compris les éventuels amendements).
629
629
  <script>Latn</script>
630
630
  <status>
631
631
  <stage>90</stage>
632
- <substage>93</substage>
632
+ <substage>20</substage>
633
633
  </status>
634
634
  <copyright>
635
635
  <from>2001</from>
@@ -654,7 +654,7 @@ compris les éventuels amendements).
654
654
  <uri type='obp'>https://www.iso.org/obp/ui/#!iso:std:23281:en</uri>
655
655
  <uri type='rss'>https://www.iso.org/contents/data/standard/02/32/23281.detail.rss</uri>
656
656
  <docidentifier type='ISO'>ISO 123:2001</docidentifier>
657
- <docidentifier type='URN'>urn:iso:std:iso:123:stage-90.93:ed-3:fr</docidentifier>
657
+ <docidentifier type='URN'>urn:iso:std:iso:123:stage-90.20:ed-3:fr</docidentifier>
658
658
  <docnumber>123</docnumber>
659
659
  <date type='published'>
660
660
  <on>2001-05</on>
@@ -682,7 +682,7 @@ compris les éventuels amendements).
682
682
  </abstract>
683
683
  <status>
684
684
  <stage>90</stage>
685
- <substage>93</substage>
685
+ <substage>20</substage>
686
686
  </status>
687
687
  <copyright>
688
688
  <from>2001</from>