metanorma-iso 1.3.20 → 1.3.25

Sign up to get free protection for your applications and to get access to all the features.
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