metanorma-iso 1.3.20 → 1.3.25

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 (60) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/macos.yml +10 -10
  3. data/.github/workflows/ubuntu.yml +11 -11
  4. data/.github/workflows/windows.yml +11 -12
  5. data/Gemfile +2 -0
  6. data/README.adoc +3 -2
  7. data/lib/asciidoctor/iso/base.rb +17 -1
  8. data/lib/asciidoctor/iso/biblio.rng +131 -46
  9. data/lib/asciidoctor/iso/cleanup.rb +19 -2
  10. data/lib/asciidoctor/iso/front.rb +116 -17
  11. data/lib/asciidoctor/iso/isodoc.rng +32 -4
  12. data/lib/asciidoctor/iso/isostandard-amd.rng +98 -0
  13. data/lib/asciidoctor/iso/isostandard.rng +10 -0
  14. data/lib/asciidoctor/iso/macros.rb +21 -0
  15. data/lib/asciidoctor/iso/section.rb +18 -32
  16. data/lib/asciidoctor/iso/term_lookup_cleanup.rb +90 -0
  17. data/lib/asciidoctor/iso/validate.rb +41 -21
  18. data/lib/asciidoctor/iso/validate_section.rb +2 -2
  19. data/lib/asciidoctor/iso/validate_style.rb +1 -1
  20. data/lib/isodoc/iso/base_convert.rb +57 -41
  21. data/lib/isodoc/iso/html/header.html +5 -5
  22. data/lib/isodoc/iso/html/html_iso_titlepage.html +18 -18
  23. data/lib/isodoc/iso/html/isodoc.scss +28 -28
  24. data/lib/isodoc/iso/html/scripts.html +23 -21
  25. data/lib/isodoc/iso/html/style-human.scss +259 -423
  26. data/lib/isodoc/iso/html/style-iso.scss +151 -382
  27. data/lib/isodoc/iso/html/word_iso_titlepage.html +23 -2
  28. data/lib/isodoc/iso/html/wordstyle.scss +66 -39
  29. data/lib/isodoc/iso/html_convert.rb +7 -9
  30. data/lib/isodoc/iso/iso.international-standard.xsl +4386 -0
  31. data/lib/isodoc/iso/metadata.rb +48 -22
  32. data/lib/isodoc/iso/pdf_convert.rb +32 -0
  33. data/lib/metanorma-iso.rb +1 -0
  34. data/lib/metanorma/iso/processor.rb +13 -1
  35. data/lib/metanorma/iso/version.rb +1 -1
  36. data/spec/asciidoctor-iso/amd_spec.rb +318 -0
  37. data/spec/asciidoctor-iso/base_spec.rb +37 -17
  38. data/spec/asciidoctor-iso/blocks_spec.rb +21 -9
  39. data/spec/asciidoctor-iso/cleanup_spec.rb +203 -175
  40. data/spec/asciidoctor-iso/inline_spec.rb +2 -1
  41. data/spec/asciidoctor-iso/macros_spec.rb +273 -0
  42. data/spec/asciidoctor-iso/refs_spec.rb +7 -4
  43. data/spec/asciidoctor-iso/section_spec.rb +8 -8
  44. data/spec/asciidoctor-iso/validate_spec.rb +1 -1
  45. data/spec/assets/iso.xml +64 -1
  46. data/spec/isodoc/blocks_spec.rb +115 -0
  47. data/spec/isodoc/i18n_spec.rb +12 -20
  48. data/spec/isodoc/inline_spec.rb +2 -2
  49. data/spec/isodoc/iso_spec.rb +1 -1
  50. data/spec/isodoc/metadata_spec.rb +13 -4
  51. data/spec/isodoc/postproc_spec.rb +13 -112
  52. data/spec/isodoc/ref_spec.rb +4 -4
  53. data/spec/isodoc/section_spec.rb +8 -12
  54. data/spec/isodoc/table_spec.rb +24 -24
  55. data/spec/isodoc/terms_spec.rb +2 -2
  56. data/spec/isodoc/xref_spec.rb +19 -19
  57. data/spec/metanorma/processor_spec.rb +2 -2
  58. data/spec/spec_helper.rb +13 -1
  59. metadata +9 -3
  60. data/asciidoctor-iso.gemspec.old +0 -50
@@ -16,26 +16,12 @@ module IsoDoc
16
16
  }
17
17
  end
18
18
 
19
- STAGE_ABBRS = {
20
- "00": "PWI",
21
- "10": "NWIP",
22
- "20": "WD",
23
- "30": "CD",
24
- "40": "DIS",
25
- "50": "FDIS",
26
- "60": "IS",
27
- "90": "(Review)",
28
- "95": "(Withdrawal)",
29
- }.freeze
30
-
31
- def stage_abbr(stage)
32
- self.class::STAGE_ABBRS[stage.to_sym] || "??"
33
- end
34
-
35
- def status_abbrev(stage, substage, iter, draft)
19
+ def status_abbrev(stage, substage, iter, draft, doctype)
36
20
  return "" unless stage
37
- stage = self.class::STAGE_ABBRS[stage.to_sym] || "??"
38
- stage = "PRF" if stage == "IS" && substage == "00"
21
+ if %w(technical-report technical-specification).include?(doctype)
22
+ stage = "DTS" if stage == "DIS"
23
+ stage = "FDTS" if stage == "FDIS"
24
+ end
39
25
  stage += iter if iter
40
26
  stage = "Pre" + stage if draft =~ /^0\./
41
27
  stage
@@ -48,12 +34,13 @@ module IsoDoc
48
34
  set(:stage, docstatus.text)
49
35
  set(:stage_int, docstatus.text.to_i)
50
36
  set(:unpublished, unpublished(docstatus.text))
51
- set(:statusabbr, status_abbrev(docstatus.text,
37
+ set(:statusabbr, status_abbrev(docstatus["abbreviation"] || "??",
52
38
  isoxml&.at(ns("//bibdata/status/substage"))&.text,
53
39
  isoxml&.at(ns("//bibdata/status/iteration"))&.text,
54
- isoxml&.at(ns("//version/draft"))&.text))
40
+ isoxml&.at(ns("//version/draft"))&.text,
41
+ isoxml&.at(ns("//bibdata/ext/doctype"))&.text))
55
42
  unpublished(docstatus.text) and
56
- set(:stageabbr, stage_abbr(docstatus.text))
43
+ set(:stageabbr, docstatus["abbreviation"])
57
44
  end
58
45
  revdate = isoxml.at(ns("//version/revision-date"))
59
46
  set(:revdate, revdate&.text)
@@ -68,6 +55,10 @@ module IsoDoc
68
55
  set(:docnumber, dn&.text)
69
56
  tcdn = isoxml.xpath(ns("//bibdata/docidentifier[@type = 'iso-tc']"))
70
57
  set(:tc_docnumber, tcdn.map { |n| n.text })
58
+ dn = isoxml.at(ns("//bibdata/docidentifier[@type = 'iso-with-lang']"))
59
+ set(:docnumber_lang, dn&.text)
60
+ dn = isoxml.at(ns("//bibdata/docidentifier[@type = 'iso-reference']"))
61
+ set(:docnumber_reference, dn&.text)
71
62
  end
72
63
 
73
64
  # we don't leave this to i18n.rb, because we have both English and
@@ -79,6 +70,20 @@ module IsoDoc
79
70
  end
80
71
  end
81
72
 
73
+ def amd_label(lang)
74
+ case lang
75
+ when "en" then "AMENDMENT"
76
+ when "fr" then "AMENDMENT"
77
+ end
78
+ end
79
+
80
+ def corr_label(lang)
81
+ case lang
82
+ when "en" then "TECHNICAL CORRIGENDUM"
83
+ when "fr" then "RECTIFICATIF TECHNIQUE"
84
+ end
85
+ end
86
+
82
87
  def part_title(part, partnum, subpartnum, lang)
83
88
  return "" unless part
84
89
  suffix = @c.encode(part.text, :hexadecimal)
@@ -92,6 +97,14 @@ module IsoDoc
92
97
  "#{part_label(lang)} #{partnum}"
93
98
  end
94
99
 
100
+ def amd_prefix(num, lang)
101
+ "#{amd_label(lang)} #{num}"
102
+ end
103
+
104
+ def corr_prefix(num, lang)
105
+ "#{corr_label(lang)} #{num}"
106
+ end
107
+
95
108
  def compose_title(main, intro, part, partnum, subpartnum, lang)
96
109
  main = main.nil? ? "" : @c.encode(main.text, :hexadecimal)
97
110
  intro &&
@@ -109,6 +122,9 @@ module IsoDoc
109
122
  part = isoxml.at(ns("//bibdata//title[@type='title-part' and @language='en']"))
110
123
  partnumber = isoxml.at(ns("//bibdata//project-number/@part"))
111
124
  subpartnumber = isoxml.at(ns("//bibdata//project-number/@subpart"))
125
+ amdnumber = isoxml.at(ns("//bibdata//project-number/@amendment"))
126
+ corrnumber = isoxml.at(ns("//bibdata//project-number/@corrigendum"))
127
+ amd = isoxml.at(ns("//bibdata//title[@type='title-amd' and @language='en']"))
112
128
 
113
129
  set(:doctitlemain, @c.encode(main ? main.text : "", :hexadecimal))
114
130
  main = compose_title(main, intro, part, partnumber, subpartnumber, "en")
@@ -116,6 +132,9 @@ module IsoDoc
116
132
  set(:doctitleintro, @c.encode(intro ? intro.text : "", :hexadecimal)) if intro
117
133
  set(:doctitlepartlabel, part_prefix(partnumber, subpartnumber, "en"))
118
134
  set(:doctitlepart, @c.encode(part.text, :hexadecimal)) if part
135
+ set(:doctitleamdlabel, amd_prefix(amdnumber, "en")) if amdnumber
136
+ set(:doctitleamd, @c.encode(amd.text, :hexadecimal)) if amd
137
+ set(:doctitlecorrlabel, corr_prefix(corrnumber, "en")) if corrnumber
119
138
  end
120
139
 
121
140
  def subtitle(isoxml, _out)
@@ -124,12 +143,19 @@ module IsoDoc
124
143
  part = isoxml.at(ns("//bibdata//title[@type='title-part' and @language='fr']"))
125
144
  partnumber = isoxml.at(ns("//bibdata//project-number/@part"))
126
145
  subpartnumber = isoxml.at(ns("//bibdata//project-number/@subpart"))
146
+ amdnumber = isoxml.at(ns("//bibdata//project-number/@amendment"))
147
+ corrnumber = isoxml.at(ns("//bibdata//project-number/@corrigendum"))
148
+ amd = isoxml.at(ns("//bibdata//title[@type='title-amd' and @language='fr']"))
149
+
127
150
  set(:docsubtitlemain, @c.encode(main ? main.text : "", :hexadecimal))
128
151
  main = compose_title(main, intro, part, partnumber, subpartnumber, "fr")
129
152
  set(:docsubtitle, main)
130
153
  set(:docsubtitleintro, @c.encode(intro ? intro.text : "", :hexadecimal)) if intro
131
154
  set(:docsubtitlepartlabel, part_prefix(partnumber, subpartnumber, "fr"))
132
155
  set(:docsubtitlepart, @c.encode(part.text, :hexadecimal)) if part
156
+ set(:docsubtitleamdlabel, amd_prefix(amdnumber, "fr")) if amdnumber
157
+ set(:docsubtitleamd, @c.encode(amd.text, :hexadecimal)) if amd
158
+ set(:docsubtitlecorrlabel, corr_prefix(corrnumber, "fr")) if corrnumber
133
159
  end
134
160
 
135
161
  def author(xml, _out)
@@ -0,0 +1,32 @@
1
+ require_relative "base_convert"
2
+ require "isodoc"
3
+
4
+ module IsoDoc
5
+ module Iso
6
+
7
+ # A {Converter} implementation that generates HTML output, and a document
8
+ # schema encapsulation of the document for validation
9
+ #
10
+ class PdfConvert < IsoDoc::XslfoPdfConvert
11
+ def initialize(options)
12
+ @libdir = File.dirname(__FILE__)
13
+ super
14
+ end
15
+
16
+ def convert(filename, file = nil, debug = false)
17
+ file = File.read(filename, encoding: "utf-8") if file.nil?
18
+ docxml, outname_html, dir = convert_init(file, filename, debug)
19
+ /\.xml$/.match(filename) or
20
+ filename = Tempfile.open([outname_html, ".xml"], encoding: "utf-8") do |f|
21
+ f.write file
22
+ f.path
23
+ end
24
+ FileUtils.rm_rf dir
25
+ ::Metanorma::Output::XslfoPdf.new.convert(
26
+ filename, outname_html + ".pdf",
27
+ File.join(@libdir, "iso.international-standard.xsl"))
28
+ end
29
+ end
30
+ end
31
+ end
32
+
@@ -3,6 +3,7 @@ require_relative "asciidoctor/iso/converter"
3
3
  require_relative "metanorma/iso/version"
4
4
  require_relative "isodoc/iso/html_convert"
5
5
  require_relative "isodoc/iso/word_convert"
6
+ require_relative "isodoc/iso/pdf_convert"
6
7
  require "asciidoctor/extensions"
7
8
 
8
9
  if defined? Metanorma
@@ -2,6 +2,15 @@ require "metanorma/processor"
2
2
 
3
3
  module Metanorma
4
4
  module Iso
5
+ def self.fonts_used
6
+ {
7
+ html: ["Cambria", "Times New Roman", "Cambria Math", "HanSans", "Courier New"],
8
+ html_alt: ["Cambria", "Times New Roman", "Cambria Math", "HanSans", "Courier New"],
9
+ doc: ["Cambria", "Times New Roman", "Cambria Math", "HanSans", "Courier New"],
10
+ pdf: ["Cambria", "Times New Roman", "Cambria Math", "HanSans", "Courier New"],
11
+ }
12
+ end
13
+
5
14
  class Processor < Metanorma::Processor
6
15
 
7
16
  def initialize
@@ -14,7 +23,8 @@ module Metanorma
14
23
  super.merge(
15
24
  html: "html",
16
25
  html_alt: "alt.html",
17
- doc: "doc"
26
+ doc: "doc",
27
+ pdf: "pdf"
18
28
  )
19
29
  end
20
30
 
@@ -34,6 +44,8 @@ module Metanorma
34
44
  IsoDoc::Iso::HtmlConvert.new(options.merge(alt: true)).convert(outname, isodoc_node)
35
45
  when :doc
36
46
  IsoDoc::Iso::WordConvert.new(options).convert(outname, isodoc_node)
47
+ when :pdf
48
+ IsoDoc::Iso::PdfConvert.new(options).convert(outname, isodoc_node)
37
49
  else
38
50
  super
39
51
  end
@@ -1,5 +1,5 @@
1
1
  module Metanorma
2
2
  module ISO
3
- VERSION = "1.3.20".freeze
3
+ VERSION = "1.3.25".freeze
4
4
  end
5
5
  end
@@ -0,0 +1,318 @@
1
+ require "spec_helper"
2
+ require "fileutils"
3
+
4
+ RSpec.describe Asciidoctor::ISO do
5
+ it "validates amendment document against distinct ISO XML schema" do
6
+ FileUtils.rm_f "test.err"
7
+ Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true)
8
+ = Document title
9
+ Author
10
+ :docfile: test.adoc
11
+ :nodoc:
12
+ :no-isobib:
13
+ :doctype: amendment
14
+
15
+ [change=mid-air]
16
+ == Para
17
+ INPUT
18
+ expect(File.read("test.err")).to include 'value of attribute "change" is invalid; must be equal to'
19
+ end
20
+
21
+ it "processes amendment sections" do
22
+ expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
23
+ #{AMD_BLANK_HDR}
24
+ == Foreword
25
+
26
+ Text
27
+
28
+ == Introduction
29
+
30
+ === Introduction Subsection
31
+
32
+ == Scope
33
+
34
+ Text
35
+
36
+ == Acknowledgements
37
+
38
+ == Normative References
39
+
40
+ == Terms and Definitions
41
+
42
+ === Term1
43
+
44
+ == Terms, Definitions, Symbols and Abbreviated Terms
45
+
46
+ === Normal Terms
47
+
48
+ ==== Term2
49
+
50
+ === Symbols and Abbreviated Terms
51
+
52
+ == Symbols and Abbreviated Terms
53
+
54
+ == Clause 4
55
+
56
+ === Introduction
57
+
58
+ === Clause 4.2
59
+
60
+ == Terms and Definitions
61
+
62
+ [appendix]
63
+ == Annex
64
+
65
+ === Annex A.1
66
+
67
+ [%appendix]
68
+ === Appendix 1
69
+
70
+ == Bibliography
71
+
72
+ === Bibliography Subsection
73
+ INPUT
74
+ #{BLANK_HDR.sub(%r{<doctype>article</doctype>}, "<doctype>amendment</doctype>")}
75
+ <sections>
76
+ <clause id='_' obligation='normative'>
77
+ <title>Foreword</title>
78
+ <p id='_'>Text</p>
79
+ </clause>
80
+ <clause id='_' obligation='normative'>
81
+ <title>Introduction</title>
82
+ <clause id='_' obligation='normative'>
83
+ <title>Introduction Subsection</title>
84
+ </clause>
85
+ </clause>
86
+ <clause id='_' obligation='normative'>
87
+ <title>Scope</title>
88
+ <p id='_'>Text</p>
89
+ </clause>
90
+ <clause id='_' obligation='normative'>
91
+ <title>Acknowledgements</title>
92
+ </clause>
93
+ <clause id='_' obligation='normative'>
94
+ <title>Normative References</title>
95
+ </clause>
96
+ <clause id='_' obligation='normative'>
97
+ <title>Terms and Definitions</title>
98
+ <clause id='_' obligation='normative'>
99
+ <title>Term1</title>
100
+ </clause>
101
+ </clause>
102
+ <clause id='_' obligation='normative'>
103
+ <title>Terms, Definitions, Symbols and Abbreviated Terms</title>
104
+ <clause id='_' obligation='normative'>
105
+ <title>Normal Terms</title>
106
+ <clause id='_' obligation='normative'>
107
+ <title>Term2</title>
108
+ </clause>
109
+ </clause>
110
+ <clause id='_' obligation='normative'>
111
+ <title>Symbols and Abbreviated Terms</title>
112
+ </clause>
113
+ </clause>
114
+ <clause id='_' obligation='normative'>
115
+ <title>Symbols and Abbreviated Terms</title>
116
+ </clause>
117
+ <clause id='_' obligation='normative'>
118
+ <title>Clause 4</title>
119
+ <clause id='_' obligation='normative'>
120
+ <title>Introduction</title>
121
+ </clause>
122
+ <clause id='_' obligation='normative'>
123
+ <title>Clause 4.2</title>
124
+ </clause>
125
+ </clause>
126
+ <clause id='_' obligation='normative'>
127
+ <title>Terms and Definitions</title>
128
+ </clause>
129
+ <clause id='_' obligation='normative'>
130
+ <title>Bibliography</title>
131
+ <clause id='_' obligation='normative'>
132
+ <title>Bibliography Subsection</title>
133
+ </clause>
134
+ </clause>
135
+ </sections>
136
+ <annex id='_' obligation='normative'>
137
+ <title>Annex</title>
138
+ <clause id='_' obligation='normative'>
139
+ <title>Annex A.1</title>
140
+ </clause>
141
+ <appendix id='_' obligation='normative'>
142
+ <title>Appendix 1</title>
143
+ </appendix>
144
+ </annex>
145
+ </iso-standard>
146
+
147
+ OUTPUT
148
+ end
149
+
150
+ it "processes section attributes" do
151
+ expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
152
+ #{AMD_BLANK_HDR}
153
+ [change=delete,locality="clause=introduction,paragraph=4-7",inline-header="true"]
154
+ == Clause 1
155
+
156
+ INPUT
157
+ #{BLANK_HDR.sub(%r{<doctype>article</doctype>}, "<doctype>amendment</doctype>")}
158
+ <sections><clause id="_" obligation="normative" change="delete" locality="clause=introduction,paragraph=4-7">
159
+ <title>Clause 1</title>
160
+ </clause>
161
+ </sections>
162
+ </iso-standard>
163
+ OUTPUT
164
+ end
165
+
166
+ it "processes default metadata, amendment" do
167
+ expect(xmlpp(Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true).sub(%r{<boilerplate>.*</boilerplate>}m, ""))).to be_equivalent_to xmlpp(<<~"OUTPUT")
168
+ = Document title
169
+ Author
170
+ :docfile: test.adoc
171
+ :nodoc:
172
+ :novalid:
173
+ :no-isobib:
174
+ :docnumber: 17301
175
+ :partnumber: 1
176
+ :edition: 2
177
+ :revdate: 2000-01-01
178
+ :draft: 0.3.4
179
+ :technical-committee: TC
180
+ :technical-committee-number: 1
181
+ :technical-committee-type: A
182
+ :subcommittee: SC
183
+ :subcommittee-number: 2
184
+ :subcommittee-type: B
185
+ :workgroup: WG
186
+ :workgroup-number: 3
187
+ :workgroup-type: C
188
+ :technical-committee_2: TC1
189
+ :technical-committee-number_2: 11
190
+ :technical-committee-type_2: A1
191
+ :subcommittee_2: SC1
192
+ :subcommittee-number_2: 21
193
+ :subcommittee-type_2: B1
194
+ :workgroup_2: WG1
195
+ :workgroup-number_2: 31
196
+ :workgroup-type_2: C1
197
+ :secretariat: SECRETARIAT
198
+ :docstage: 10
199
+ :docsubstage: 20
200
+ :iteration: 3
201
+ :language: en
202
+ :title-intro-en: Introduction
203
+ :title-main-en: Main Title -- Title
204
+ :title-part-en: Title Part
205
+ :title-intro-fr: Introduction Française
206
+ :title-main-fr: Titre Principal
207
+ :title-part-fr: Part du Titre
208
+ :library-ics: 1,2,3
209
+ :copyright-year: 2017
210
+ :updates: ISO 17301-1:2016
211
+ :created-date: 2016-05-01
212
+ :amendment-number: 1
213
+ :title-amendment-en: Mass fraction of extraneous matter, milled rice (nonglutinous), sample dividers and recommendations relating to storage and transport conditions
214
+ :title-amendment-fr: Fraction massique de matière étrangère, riz usiné (non gluant), diviseurs d’échantillon et recommandations relatives aux conditions d’entreposage et de transport
215
+ :doctype: amendment
216
+ :updates-document-type: international-standard
217
+ INPUT
218
+ <iso-standard xmlns='https://www.metanorma.org/ns/iso'>
219
+ <bibdata type='standard'>
220
+ <title language='en' format='text/plain' type='main'>Introduction — Main Title — Title — Title Part — Mass fraction of
221
+ extraneous matter, milled rice (nonglutinous), sample dividers and
222
+ recommendations relating to storage and transport conditions</title>
223
+ <title language='en' format='text/plain' type='title-intro'>Introduction</title>
224
+ <title language='en' format='text/plain' type='title-main'>Main Title — Title</title>
225
+ <title language='en' format='text/plain' type='title-part'>Title Part</title>
226
+ <title language='en' format='text/plain' type='title-amd'>
227
+ Mass fraction of extraneous matter, milled rice (nonglutinous), sample
228
+ dividers and recommendations relating to storage and transport conditions
229
+ </title>
230
+ <title language='fr' format='text/plain' type='main'>
231
+ Introduction Française — Titre Principal — Part du Titre — Fraction
232
+ massique de matière étrangère, riz usiné (non gluant), diviseurs
233
+ d’échantillon et recommandations relatives aux conditions d’entreposage et
234
+ de transport
235
+ </title>
236
+ <title language='fr' format='text/plain' type='title-intro'>Introduction Française</title>
237
+ <title language='fr' format='text/plain' type='title-main'>Titre Principal</title>
238
+ <title language='fr' format='text/plain' type='title-part'>Part du Titre</title>
239
+ <title language='fr' format='text/plain' type='title-amd'>
240
+ Fraction massique de matière étrangère, riz usiné (non gluant), diviseurs
241
+ d’échantillon et recommandations relatives aux conditions d’entreposage et
242
+ de transport
243
+ </title>
244
+ <docidentifier type='iso'>ISO/PreNWIP3 17301-1:2016/Amd.1</docidentifier>
245
+ <docidentifier type='iso-with-lang'>ISO/PreNWIP3 17301-1:2016/Amd.1(E)</docidentifier>
246
+ <docidentifier type='iso-reference'>ISO/PreNWIP3 17301-1:2016/Amd.1:2017(E)</docidentifier>
247
+ <docnumber>17301</docnumber>
248
+ <date type='created'>
249
+ <on>2016-05-01</on>
250
+ </date>
251
+ <contributor>
252
+ <role type='author'/>
253
+ <organization>
254
+ <name>International Organization for Standardization</name>
255
+ <abbreviation>ISO</abbreviation>
256
+ </organization>
257
+ </contributor>
258
+ <contributor>
259
+ <role type='publisher'/>
260
+ <organization>
261
+ <name>International Organization for Standardization</name>
262
+ <abbreviation>ISO</abbreviation>
263
+ </organization>
264
+ </contributor>
265
+ <edition>2</edition>
266
+ <version>
267
+ <revision-date>2000-01-01</revision-date>
268
+ <draft>0.3.4</draft>
269
+ </version>
270
+ <language>en</language>
271
+ <script>Latn</script>
272
+ <status>
273
+ <stage abbreviation='NWIP'>10</stage>
274
+ <substage>20</substage>
275
+ <iteration>3</iteration>
276
+ </status>
277
+ <copyright>
278
+ <from>2017</from>
279
+ <owner>
280
+ <organization>
281
+ <name>International Organization for Standardization</name>
282
+ <abbreviation>ISO</abbreviation>
283
+ </organization>
284
+ </owner>
285
+ </copyright>
286
+ <ext>
287
+ <doctype>amendment</doctype>
288
+ <editorialgroup>
289
+ <technical-committee number='1' type='A'>TC</technical-committee>
290
+ <technical-committee number='11' type='A1'>TC1</technical-committee>
291
+ <subcommittee number='2' type='B'>SC</subcommittee>
292
+ <subcommittee number='21' type='B1'>SC1</subcommittee>
293
+ <workgroup number='3' type='C'>WG</workgroup>
294
+ <workgroup number='31' type='C1'>WG1</workgroup>
295
+ <secretariat>SECRETARIAT</secretariat>
296
+ </editorialgroup>
297
+ <ics>
298
+ <code>1</code>
299
+ </ics>
300
+ <ics>
301
+ <code>2</code>
302
+ </ics>
303
+ <ics>
304
+ <code>3</code>
305
+ </ics>
306
+ <structuredidentifier>
307
+ <project-number part='1' amendment='1' origyr='2016-05-01'>17301</project-number>
308
+ </structuredidentifier>
309
+ <stagename>New work item proposal</stagename>
310
+ <updates-document-type>international-standard</updates-document-type>
311
+ </ext>
312
+ </bibdata>
313
+ <sections/>
314
+ </iso-standard>
315
+ OUTPUT
316
+ end
317
+
318
+ end