metanorma-standoc 1.10.1 → 1.10.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (30) hide show
  1. checksums.yaml +4 -4
  2. data/lib/asciidoctor/standoc/cleanup.rb +61 -0
  3. data/lib/asciidoctor/standoc/converter.rb +4 -0
  4. data/lib/asciidoctor/standoc/datamodel/diagram_preprocessor.rb +22 -21
  5. data/lib/asciidoctor/standoc/isodoc.rng +12 -0
  6. data/lib/asciidoctor/standoc/macros.rb +18 -0
  7. data/lib/asciidoctor/standoc/ref.rb +60 -56
  8. data/lib/asciidoctor/standoc/reqt.rb +39 -27
  9. data/lib/asciidoctor/standoc/reqt.rng +7 -0
  10. data/lib/asciidoctor/standoc/term_lookup_cleanup.rb +1 -1
  11. data/lib/asciidoctor/standoc/validate_section.rb +2 -1
  12. data/lib/metanorma/standoc/version.rb +1 -1
  13. data/metanorma-standoc.gemspec +1 -1
  14. data/spec/asciidoctor/blocks_spec.rb +45 -25
  15. data/spec/asciidoctor/cleanup_sections_spec.rb +899 -864
  16. data/spec/asciidoctor/cleanup_spec.rb +56 -6
  17. data/spec/asciidoctor/macros_plantuml_spec.rb +165 -104
  18. data/spec/asciidoctor/macros_spec.rb +277 -0
  19. data/spec/fixtures/datamodel_description_sections_tree.xml +327 -0
  20. data/spec/fixtures/test.xmi +9250 -0
  21. data/spec/support/shared_examples/structured_data_2_text_preprocessor.rb +34 -34
  22. data/spec/vcr_cassettes/dated_iso_ref_joint_iso_iec.yml +50 -50
  23. data/spec/vcr_cassettes/isobib_get_123.yml +11 -11
  24. data/spec/vcr_cassettes/isobib_get_123_1.yml +23 -23
  25. data/spec/vcr_cassettes/isobib_get_123_1_fr.yml +35 -35
  26. data/spec/vcr_cassettes/isobib_get_123_2001.yml +12 -12
  27. data/spec/vcr_cassettes/isobib_get_124.yml +11 -11
  28. data/spec/vcr_cassettes/rfcbib_get_rfc8341.yml +14 -14
  29. data/spec/vcr_cassettes/separates_iev_citations_by_top_level_clause.yml +46 -46
  30. metadata +6 -4
@@ -663,6 +663,75 @@ RSpec.describe Asciidoctor::Standoc do
663
663
  .to be_equivalent_to xmlpp(output)
664
664
  end
665
665
 
666
+ it "processes the concept macros with disambiguation for math symbols" do
667
+ input = <<~INPUT
668
+ #{ASCIIDOC_BLANK_HDR}
669
+ [[clause1]]
670
+
671
+ == Symbols and Abbreviated Terms
672
+ stem:[|~ x ~|]:: A function that returns the smallest integer greater than or equal to stem:[x]; also known as the _ceiling_ function.
673
+ stem:[|__ x __|]:: A function that returns the largest integer less than or equal to stem:[x]; also known as the _floor_ function.
674
+ INPUT
675
+ output = <<~OUTPUT
676
+ #{BLANK_HDR}
677
+ <sections>
678
+ <definitions id='clause1' obligation='normative'>
679
+ <title>Symbols and abbreviated terms</title>
680
+ <dl id='_'>
681
+ <dt id='symbol-_-_x_-'>
682
+ <stem type='MathML'>
683
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
684
+ <mo>&#8970;</mo>
685
+ <mi>x</mi>
686
+ <mo>&#8971;</mo>
687
+ </math>
688
+ </stem>
689
+ </dt>
690
+ <dd>
691
+ <p id='_'>
692
+ A function that returns the largest integer less than or equal to
693
+ <stem type='MathML'>
694
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
695
+ <mi>x</mi>
696
+ </math>
697
+ </stem>
698
+ ; also known as the
699
+ <em>floor</em>
700
+ function.
701
+ </p>
702
+ </dd>
703
+ <dt id='symbol-_-_x_--1'>
704
+ <stem type='MathML'>
705
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
706
+ <mo>&#8968;</mo>
707
+ <mi>x</mi>
708
+ <mo>&#8969;</mo>
709
+ </math>
710
+ </stem>
711
+ </dt>
712
+ <dd>
713
+ <p id='_'>
714
+ A function that returns the smallest integer greater than or equal
715
+ to
716
+ <stem type='MathML'>
717
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
718
+ <mi>x</mi>
719
+ </math>
720
+ </stem>
721
+ ; also known as the
722
+ <em>ceiling</em>
723
+ function.
724
+ </p>
725
+ </dd>
726
+ </dl>
727
+ </definitions>
728
+ </sections>
729
+ </standard-document>
730
+ OUTPUT
731
+ expect(xmlpp(strip_guid(Asciidoctor.convert(input, *OPTIONS))))
732
+ .to be_equivalent_to xmlpp(output)
733
+ end
734
+
666
735
  it "processes the TODO custom admonition" do
667
736
  input = <<~INPUT
668
737
  #{ASCIIDOC_BLANK_HDR}
@@ -1062,6 +1131,105 @@ RSpec.describe Asciidoctor::Standoc do
1062
1131
  .to be_equivalent_to xmlpp(output)
1063
1132
  end
1064
1133
 
1134
+ it "processes ToC form macros" do
1135
+ input = <<~INPUT
1136
+ #{ASCIIDOC_BLANK_HDR}
1137
+
1138
+ [[clause1]]
1139
+ == Clause 1
1140
+
1141
+ [[clause1A]]
1142
+ === Clause 1A
1143
+
1144
+ [[clause1Aa]]
1145
+ ==== Clause 1Aa
1146
+
1147
+ [[clause1Ab]]
1148
+ ==== Clause 1Ab
1149
+
1150
+ [[clause1B]]
1151
+ === Clause 1B
1152
+
1153
+ [[clause1Ba]]
1154
+ ==== Clause 1Ba
1155
+
1156
+ [[clause2]]
1157
+ == Clause 2
1158
+
1159
+ And introducing:
1160
+ toc:["//clause[@id = 'clause1'\\]/clause/title","//clause[@id = 'clause1'\\]/clause/clause/title:2"]
1161
+
1162
+ toc:["//clause[@id = 'clause1'\\]/clause/title"]
1163
+ INPUT
1164
+ output = <<~OUTPUT
1165
+ #{BLANK_HDR}
1166
+ <sections>
1167
+ <clause id='clause1' inline-header='false' obligation='normative'>
1168
+ <title>Clause 1</title>
1169
+ <clause id='clause1A' inline-header='false' obligation='normative'>
1170
+ <title>Clause 1A</title>
1171
+ <clause id='clause1Aa' inline-header='false' obligation='normative'>
1172
+ <title>Clause 1Aa</title>
1173
+ </clause>
1174
+ <clause id='clause1Ab' inline-header='false' obligation='normative'>
1175
+ <title>Clause 1Ab</title>
1176
+ </clause>
1177
+ </clause>
1178
+ <clause id='clause1B' inline-header='false' obligation='normative'>
1179
+ <title>Clause 1B</title>
1180
+ <clause id='clause1Ba' inline-header='false' obligation='normative'>
1181
+ <title>Clause 1Ba</title>
1182
+ </clause>
1183
+ </clause>
1184
+ </clause>
1185
+ <clause id='clause2' inline-header='false' obligation='normative'>
1186
+ <title>Clause 2</title>
1187
+ <p id='_'>And introducing: </p>
1188
+ <toc>
1189
+ <ul id='_'>
1190
+ <li>
1191
+ <xref target='clause1A'>Clause 1A</xref>
1192
+ </li>
1193
+ <li>
1194
+ <ul id='_'>
1195
+ <li>
1196
+ <xref target='clause1Aa'>Clause 1Aa</xref>
1197
+ </li>
1198
+ <li>
1199
+ <xref target='clause1Ab'>Clause 1Ab</xref>
1200
+ </li>
1201
+ </ul>
1202
+ </li>
1203
+ <li>
1204
+ <xref target='clause1B'>Clause 1B</xref>
1205
+ </li>
1206
+ <li>
1207
+ <ul id='_'>
1208
+ <li>
1209
+ <xref target='clause1Ba'>Clause 1Ba</xref>
1210
+ </li>
1211
+ </ul>
1212
+ </li>
1213
+ </ul>
1214
+ </toc>
1215
+ <toc>
1216
+ <ul id='_'>
1217
+ <li>
1218
+ <xref target='clause1A'>Clause 1A</xref>
1219
+ </li>
1220
+ <li>
1221
+ <xref target='clause1B'>Clause 1B</xref>
1222
+ </li>
1223
+ </ul>
1224
+ </toc>
1225
+ </clause>
1226
+ </sections>
1227
+ </standard-document>
1228
+ OUTPUT
1229
+ expect(xmlpp(strip_guid(Asciidoctor.convert(input, *OPTIONS))))
1230
+ .to be_equivalent_to xmlpp(output)
1231
+ end
1232
+
1065
1233
  describe "term inline macros" do
1066
1234
  subject(:convert) do
1067
1235
  xmlpp(
@@ -1373,4 +1541,113 @@ RSpec.describe Asciidoctor::Standoc do
1373
1541
  end
1374
1542
  end
1375
1543
  end
1544
+
1545
+ describe "lutaml_figure macro" do
1546
+ let(:example_file) { fixtures_path("test.xmi") }
1547
+ let(:input) do
1548
+ <<~TEXT
1549
+ = Document title
1550
+ Author
1551
+ :docfile: test.adoc
1552
+ :nodoc:
1553
+ :novalid:
1554
+ :no-isobib:
1555
+ :imagesdir: spec/assets
1556
+
1557
+ [lutaml_uml_datamodel_description,#{example_file}]
1558
+ --
1559
+ --
1560
+
1561
+ This is lutaml_figure::[package="Wrapper root package", name="Fig B1 Full model"] figure
1562
+ TEXT
1563
+ end
1564
+ let(:output) do
1565
+ '<xref target="figure-EAID_0E029ABF_C35A_49e3_9EEA_FFD4F32780A8">'
1566
+ end
1567
+
1568
+ it "correctly renders input" do
1569
+ expect(strip_src(xml_string_conent(metanorma_process(input))))
1570
+ .to(include(output))
1571
+ end
1572
+ end
1573
+
1574
+ describe "lutaml_uml_datamodel_description macro" do
1575
+ subject(:convert) do
1576
+ xmlpp(
1577
+ strip_guid(
1578
+ Asciidoctor.convert(
1579
+ input, *OPTIONS
1580
+ ),
1581
+ ),
1582
+ )
1583
+ end
1584
+
1585
+ let(:example_file) { fixtures_path("test.xmi") }
1586
+ let(:input) do
1587
+ <<~TEXT
1588
+ = Document title
1589
+ Author
1590
+ :docfile: test.adoc
1591
+ :nodoc:
1592
+ :novalid:
1593
+ :no-isobib:
1594
+ :imagesdir: spec/assets
1595
+
1596
+ [lutaml_uml_datamodel_description,#{example_file}]
1597
+ --
1598
+ [.diagram_include_block, base_path="requirements/"]
1599
+ ...
1600
+ Diagram text
1601
+ ...
1602
+
1603
+ [.include_block, package="Another", base_path="spec/fixtures/"]
1604
+ ...
1605
+ my text
1606
+ ...
1607
+
1608
+ [.include_block, base_path="spec/fixtures/"]
1609
+ ...
1610
+ my text
1611
+ ...
1612
+
1613
+ [.before]
1614
+ ...
1615
+ mine text
1616
+ ...
1617
+
1618
+ [.before, package="Another"]
1619
+ ...
1620
+ text before Another package
1621
+ ...
1622
+
1623
+ [.after, package="Another"]
1624
+ ...
1625
+ text after Another package
1626
+ ...
1627
+
1628
+ [.after, package="CityGML"]
1629
+ ...
1630
+ text after CityGML package
1631
+ ...
1632
+
1633
+ [.after]
1634
+ ...
1635
+ footer text
1636
+ ...
1637
+ --
1638
+ TEXT
1639
+ end
1640
+ let(:output) do
1641
+ <<~TEXT
1642
+ #{BLANK_HDR}
1643
+ #{File.read(fixtures_path('datamodel_description_sections_tree.xml'))}
1644
+ </standard-document>
1645
+ TEXT
1646
+ end
1647
+
1648
+ it "correctly renders input" do
1649
+ expect(convert)
1650
+ .to(be_equivalent_to(xmlpp(output)))
1651
+ end
1652
+ end
1376
1653
  end
@@ -0,0 +1,327 @@
1
+ <preface>
2
+ <foreword id='_' obligation='informative'>
3
+ <title>Foreword</title>
4
+ <p id='_'>mine text</p>
5
+ </foreword>
6
+ </preface>
7
+ <sections>
8
+ <clause id='_' inline-header='false' obligation='normative'>
9
+ <title>Wrapper nested package package</title>
10
+ <clause id='_' inline-header='false' obligation='normative'>
11
+ <title>Wrapper nested package overview</title>
12
+ <p id='_'>Diagram text</p>
13
+ <figure id='figure-EAID_0E029ABF_C35A_49e3_9EEA_FFD4F32780A8'>
14
+ <name>Fig B1 Full model</name>
15
+ <image src='spec/assets/requirements//EAID_0E029ABF_C35A_49e3_9EEA_FFD4F32780A8.png' id='_' mimetype='image/png' height='auto' width='auto'/>
16
+ </figure>
17
+ <p id='_'>The Wrapper nested package package is organized into 1 packages:</p>
18
+ <ol id='_' type='arabic'>
19
+ <li>
20
+ <p id='_'>ISO 19135 Procedures for item registration XML package</p>
21
+ </li>
22
+ </ol>
23
+ <p id='_'>mine text</p>
24
+ </clause>
25
+ <clause id='_' inline-header='false' obligation='normative'>
26
+ <title>ISO 19135 Procedures for item registration XML package</title>
27
+ <clause id='_' inline-header='false' obligation='normative'>
28
+ <title>ISO 19135 Procedures for item registration XML overview</title>
29
+ <p id='_'>Diagram text</p>
30
+ <figure id='figure-EAID_0E029ABF_C35A_49e3_9EEA_FFD4F32780A8'>
31
+ <name>Fig B1 Full model</name>
32
+ <image src='spec/assets/requirements//EAID_0E029ABF_C35A_49e3_9EEA_FFD4F32780A8.png' id='_' mimetype='image/png' height='auto' width='auto'/>
33
+ </figure>
34
+ </clause>
35
+ <clause id='_' inline-header='false' obligation='normative'>
36
+ <title>Defining tables</title>
37
+ <table id='tab-P-iso_19135_procedures_for_item_registration_xml-C-re_register' width='100%'>
38
+ <name>Elements of ISO 19135 Procedures for item registration XML::RE_Register</name>
39
+ <tbody>
40
+ <tr>
41
+ <th valign='top' align='left'>Name:</th>
42
+ <td colspan='7' valign='top' align='left'>
43
+ <p id='_'>RE_Register</p>
44
+ </td>
45
+ </tr>
46
+ <tr>
47
+ <th valign='top' align='left'>Definition:</th>
48
+ <td colspan='7' valign='top' align='left'>
49
+ <p id='_'>
50
+ The class &#8220;RE_Register&#8221; specifies information
51
+ about the register itself. It is a subtype of the Register
52
+ class in the core profile.
53
+ </p>
54
+ </td>
55
+ </tr>
56
+ <tr>
57
+ <th valign='top' align='left'>Stereotype:</th>
58
+ <td colspan='7' valign='top' align='left'>
59
+ <p id='_'>interface</p>
60
+ </td>
61
+ </tr>
62
+ <tr>
63
+ <th valign='top' align='left'>Inheritance from:</th>
64
+ <td colspan='7' valign='top' align='left'>
65
+ <p id='_'>Register</p>
66
+ </td>
67
+ </tr>
68
+ <tr>
69
+ <th valign='top' align='left'>Generalization of:</th>
70
+ <td colspan='7' valign='top' align='left'>
71
+ <p id='_'>TermRegister, CL_ClassificationRegister, LC_LCMLRegister</p>
72
+ </td>
73
+ </tr>
74
+ <tr>
75
+ <th valign='top' align='left'>Abstract:</th>
76
+ <td colspan='7' valign='top' align='left'>
77
+ <p id='_'>false</p>
78
+ </td>
79
+ </tr>
80
+ <tr>
81
+ <th valign='top' rowspan='2' align='left'>Associations:</th>
82
+ <td colspan='4' valign='top' align='left'>
83
+ <p id='_'>
84
+ <em>Association with:</em>
85
+ </p>
86
+ </td>
87
+ <td valign='top' align='left'>
88
+ <p id='_'>
89
+ <em>Obligation</em>
90
+ </p>
91
+ </td>
92
+ <td valign='top' align='left'>
93
+ <p id='_'>
94
+ <em>Maximum occurrence</em>
95
+ </p>
96
+ </td>
97
+ <td valign='top' align='left'>
98
+ <p id='_'>
99
+ <em>Provides:</em>
100
+ </p>
101
+ </td>
102
+ </tr>
103
+ <tr>
104
+ <td colspan='4' valign='top' align='left'>
105
+ <p id='_'>RE_ReferenceSource</p>
106
+ </td>
107
+ <td valign='top' align='left'>
108
+ <p id='_'>C</p>
109
+ </td>
110
+ <td valign='top' align='left'>
111
+ <p id='_'>*</p>
112
+ </td>
113
+ <td valign='top' align='left'>
114
+ <p id='_'>citation</p>
115
+ </td>
116
+ </tr>
117
+ <tr>
118
+ <th valign='top' rowspan='6' align='left'>Public attributes:</th>
119
+ <td valign='top' align='left'>
120
+ <p id='_'>
121
+ <em>Name</em>
122
+ </p>
123
+ </td>
124
+ <td colspan='2' valign='top' align='left'>
125
+ <p id='_'>
126
+ <em>Definition</em>
127
+ </p>
128
+ </td>
129
+ <td valign='top' align='left'>
130
+ <p id='_'>
131
+ <em>Derived</em>
132
+ </p>
133
+ </td>
134
+ <td valign='top' align='left'>
135
+ <p id='_'>
136
+ <em>Obligation</em>
137
+ </p>
138
+ </td>
139
+ <td valign='top' align='left'>
140
+ <p id='_'>
141
+ <em>Maximum occurrence</em>
142
+ </p>
143
+ </td>
144
+ <td valign='top' align='left'>
145
+ <p id='_'>
146
+ <em>Data type</em>
147
+ </p>
148
+ </td>
149
+ </tr>
150
+ <tr>
151
+ <td valign='top' align='left'>
152
+ <p id='_'>alternativeLanguages</p>
153
+ </td>
154
+ <td colspan='2' valign='top' align='left'>
155
+ <p id='_'>
156
+ The attribute &#8220;alternativeLanguages&#8221; supports
157
+ cultural and linguistic adaptability, individual items in a
158
+ register may provide elements of information in additional
159
+ languages other than the operating language of the register.
160
+ The attribute
161
+ <em>alternativeLanguages</em>
162
+ shall be represented as a set of instances of RE_Locale,
163
+ each specifying an additional unique locale used by items in
164
+ the register. Every member of the set shall be used by at
165
+ least one item in the register. The
166
+ <em>locale</em>
167
+ of every
168
+ <em>alternativeExpression</em>
169
+ used by any item in the register shall be included in this
170
+ set of RE_Locales. This attribute provides a summary of
171
+ alternative locales used by items in a register. Register
172
+ owners shall specify and publish their policy as to whether
173
+ all or only some of the items in a register shall have
174
+ alternative expressions.
175
+ </p>
176
+ </td>
177
+ <td valign='top' align='left'/>
178
+ <td valign='top' align='left'>
179
+ <p id='_'>C</p>
180
+ </td>
181
+ <td valign='top' align='left'>
182
+ <p id='_'>1</p>
183
+ </td>
184
+ <td valign='top' align='left'>
185
+ <p id='_'>Set&lt;RE_Locale&gt;</p>
186
+ </td>
187
+ </tr>
188
+ <tr>
189
+ <td valign='top' align='left'>
190
+ <p id='_'>contentSummary</p>
191
+ </td>
192
+ <td colspan='2' valign='top' align='left'>
193
+ <p id='_'>
194
+ The attribute &#8220;contentSummary&#8221; is be represented
195
+ as a CharacterString containing a general statement of the
196
+ purpose for which items in the register are made available
197
+ to potential users. It should also specify any limits to the
198
+ scope of the register and identify the types of applications
199
+ for which the items are intended. NOTE The scope of a
200
+ register could be limited by theme, by region, by language
201
+ or other criteria. EXAMPLE The scope of a terminology
202
+ register could be limited to Spanish terms used to describe
203
+ landforms in Latin America.
204
+ </p>
205
+ </td>
206
+ <td valign='top' align='left'/>
207
+ <td valign='top' align='left'>
208
+ <p id='_'>M</p>
209
+ </td>
210
+ <td valign='top' align='left'>
211
+ <p id='_'>1</p>
212
+ </td>
213
+ <td valign='top' align='left'>
214
+ <p id='_'>CharacterString</p>
215
+ </td>
216
+ </tr>
217
+ <tr>
218
+ <td valign='top' align='left'>
219
+ <p id='_'>name</p>
220
+ </td>
221
+ <td colspan='2' valign='top' align='left'>
222
+ <p id='_'>
223
+ The attribute &#8220;name&#8221; is be represented as a
224
+ CharacterString containing a compact and human-readable
225
+ designator that is used to uniquely denote that register
226
+ within the set of registers maintained by the register
227
+ owner. In the case of a hierarchical register, the &#8220;
228
+ <em>name&#8221;</em>
229
+ of a subregister shall uniquely identify that subregister
230
+ within the scope EXAMPLE &#239;&#191;&#189;ISO/TC 211
231
+ Register of Feature Data Dictionaries and Feature
232
+ Catalogues&#239;&#191;&#189; might be the name of the
233
+ principal register of of all registers established by the
234
+ owner of the principal register. a hierarchical register.
235
+ &#239;&#191;&#189;DGIWG FACC Data
236
+ Dictionary&#239;&#191;&#189; and &#239;&#191;&#189;IHO S-57
237
+ Object Dictionary&#239;&#191;&#189; might be the names of
238
+ subregisters within the hierarchy.
239
+ </p>
240
+ </td>
241
+ <td valign='top' align='left'/>
242
+ <td valign='top' align='left'>
243
+ <p id='_'>M</p>
244
+ </td>
245
+ <td valign='top' align='left'>
246
+ <p id='_'>1</p>
247
+ </td>
248
+ <td valign='top' align='left'>
249
+ <p id='_'>CharacterString</p>
250
+ </td>
251
+ </tr>
252
+ <tr>
253
+ <td valign='top' align='left'>
254
+ <p id='_'>operatingLanguage</p>
255
+ </td>
256
+ <td colspan='2' valign='top' align='left'>
257
+ <p id='_'>
258
+ The attribute &#8220;operatingLanguage&#8221; is represented
259
+ as an instance of class RE_Locale that is used to specify
260
+ language, country information and character encoding for the
261
+ proper interpretation of the content of character strings in
262
+ the register. The values of all character strings in the
263
+ register shall be in accordance with the value of
264
+ &#8220;operatingLanguage&#8221;, unless otherwise stated.
265
+ </p>
266
+ </td>
267
+ <td valign='top' align='left'/>
268
+ <td valign='top' align='left'>
269
+ <p id='_'>M</p>
270
+ </td>
271
+ <td valign='top' align='left'>
272
+ <p id='_'>1</p>
273
+ </td>
274
+ <td valign='top' align='left'>
275
+ <p id='_'>EAID_3996125E_4828_4f3c_93BD_605E9059DE05</p>
276
+ </td>
277
+ </tr>
278
+ <tr>
279
+ <td valign='top' align='left'>
280
+ <p id='_'>uniformResourceIdentifier</p>
281
+ </td>
282
+ <td colspan='2' valign='top' align='left'>
283
+ <p id='_'>
284
+ The attribute &#8220;uniformResourceIdentifier&#8221; takes
285
+ as its value a set of URI&#8217;s, each referencing
286
+ information about online resources associated with the
287
+ register. EXAMPLE
288
+ &#239;&#191;&#189;http://www.digest.org/Navigate2.htm&#239;&#191;&#189; and &#239;&#191;&#189;http://www.epa.gov/opppmsd1/PPISdata/index.html&#239;&#191;&#189; are sample valuescorresponding value of the attribute
289
+ <em>OnLineResource.linkage</em>
290
+ specifies a resource providing access to the complete
291
+ content of the register. EXAMPLE
292
+ &#239;&#191;&#189;http://www.digest.org/Navigate2.htm&#239;&#191;&#189; and &#239;&#191;&#189;http://www.epa.gov/opppmsd1/PPISdata/index.html&#239;&#191;&#189; are sample values of
293
+ <em>OnLineResource.linkage</em>
294
+ .
295
+ </p>
296
+ </td>
297
+ <td valign='top' align='left'/>
298
+ <td valign='top' align='left'>
299
+ <p id='_'>M</p>
300
+ </td>
301
+ <td valign='top' align='left'>
302
+ <p id='_'>*</p>
303
+ </td>
304
+ <td valign='top' align='left'>
305
+ <p id='_'>URI</p>
306
+ </td>
307
+ </tr>
308
+ <tr>
309
+ <td valign='top' align='left'>
310
+ <p id='_'>
311
+ <strong>Constraints:</strong>
312
+ </p>
313
+ </td>
314
+ <td colspan='7' valign='top' align='left'>
315
+ <p id='_'>
316
+ <tt>count(self.version +self.dateOfLastChange) &gt;= 1</tt>
317
+ </p>
318
+ </td>
319
+ </tr>
320
+ </tbody>
321
+ </table>
322
+ <p id='_'>footer text</p>
323
+ <p id='_'>footer text</p>
324
+ </clause>
325
+ </clause>
326
+ </clause>
327
+ </sections>