rng 0.1.1 → 0.1.2
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.
- checksums.yaml +4 -4
- data/.rubocop.yml +2 -0
- data/.rubocop_todo.yml +64 -0
- data/CODE_OF_CONDUCT.md +132 -0
- data/Gemfile +3 -1
- data/README.adoc +402 -0
- data/lib/rng/any_name.rb +26 -0
- data/lib/rng/attribute.rb +58 -4
- data/lib/rng/choice.rb +60 -0
- data/lib/rng/data.rb +32 -0
- data/lib/rng/define.rb +51 -3
- data/lib/rng/element.rb +62 -16
- data/lib/rng/empty.rb +23 -0
- data/lib/rng/except.rb +62 -0
- data/lib/rng/external_ref.rb +28 -0
- data/lib/rng/grammar.rb +36 -0
- data/lib/rng/group.rb +60 -0
- data/lib/rng/include.rb +24 -0
- data/lib/rng/interleave.rb +58 -0
- data/lib/rng/list.rb +56 -0
- data/lib/rng/mixed.rb +58 -0
- data/lib/rng/name.rb +28 -0
- data/lib/rng/not_allowed.rb +23 -0
- data/lib/rng/ns_name.rb +31 -0
- data/lib/rng/one_or_more.rb +58 -0
- data/lib/rng/optional.rb +58 -0
- data/lib/rng/param.rb +30 -0
- data/lib/rng/parent_ref.rb +28 -0
- data/lib/rng/parse_rnc.rb +26 -0
- data/lib/rng/pattern.rb +24 -0
- data/lib/rng/ref.rb +28 -0
- data/lib/rng/rnc_parser.rb +351 -94
- data/lib/rng/start.rb +54 -5
- data/lib/rng/text.rb +26 -0
- data/lib/rng/to_rnc.rb +55 -0
- data/lib/rng/value.rb +29 -0
- data/lib/rng/version.rb +1 -1
- data/lib/rng/zero_or_more.rb +58 -0
- data/lib/rng.rb +29 -5
- data/rng.gemspec +3 -2
- data/spec/fixtures/rnc/address_book.rnc +10 -0
- data/spec/fixtures/rnc/complex_example.rnc +61 -0
- data/spec/fixtures/rng/address_book.rng +20 -0
- data/spec/fixtures/rng/relaxng.rng +335 -0
- data/spec/fixtures/rng/testSuite.rng +163 -0
- data/spec/fixtures/spectest.xml +6845 -0
- data/spec/rng/rnc_parser_spec.rb +6 -4
- data/spec/rng/rnc_roundtrip_spec.rb +121 -0
- data/spec/rng/schema_spec.rb +115 -166
- data/spec/rng/spectest_spec.rb +195 -0
- data/spec/spec_helper.rb +33 -0
- metadata +54 -7
- data/lib/rng/builder.rb +0 -158
- data/lib/rng/rng_parser.rb +0 -107
- data/lib/rng/schema.rb +0 -18
- data/spec/rng/rng_parser_spec.rb +0 -102
@@ -0,0 +1,58 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "lutaml/model"
|
4
|
+
|
5
|
+
module Rng
|
6
|
+
class ZeroOrMore < Lutaml::Model::Serializable
|
7
|
+
attribute :id, :string
|
8
|
+
attribute :ns, :string
|
9
|
+
attribute :datatypeLibrary, :string
|
10
|
+
attribute :element, Element, collection: true, initialize_empty: true
|
11
|
+
attribute :attribute, Attribute, collection: true, initialize_empty: true
|
12
|
+
attribute :ref, Ref, collection: true, initialize_empty: true
|
13
|
+
attribute :choice, Choice, collection: true, initialize_empty: true
|
14
|
+
attribute :group, Group, collection: true, initialize_empty: true
|
15
|
+
attribute :interleave, Interleave, collection: true, initialize_empty: true
|
16
|
+
attribute :mixed, Mixed, collection: true, initialize_empty: true
|
17
|
+
attribute :optional, Optional, collection: true, initialize_empty: true
|
18
|
+
attribute :zeroOrMore, ZeroOrMore, collection: true, initialize_empty: true
|
19
|
+
attribute :oneOrMore, OneOrMore, collection: true, initialize_empty: true
|
20
|
+
attribute :text, Text, collection: true, initialize_empty: true
|
21
|
+
attribute :empty, Empty, collection: true, initialize_empty: true
|
22
|
+
attribute :value, Value, collection: true, initialize_empty: true
|
23
|
+
attribute :data, Data, collection: true, initialize_empty: true
|
24
|
+
attribute :list, List, collection: true, initialize_empty: true
|
25
|
+
attribute :notAllowed, NotAllowed, collection: true, initialize_empty: true
|
26
|
+
|
27
|
+
xml do
|
28
|
+
root "zeroOrMore", ordered: true
|
29
|
+
namespace "http://relaxng.org/ns/structure/1.0"
|
30
|
+
|
31
|
+
map_attribute "id", to: :id
|
32
|
+
map_attribute "ns", to: :ns, value_map: {
|
33
|
+
from: { empty: :empty, omitted: :omitted, nil: :nil },
|
34
|
+
to: { empty: :empty, omitted: :omitted, nil: :nil }
|
35
|
+
}
|
36
|
+
map_attribute "datatypeLibrary", to: :datatypeLibrary, value_map: {
|
37
|
+
from: { empty: :empty, omitted: :omitted, nil: :nil },
|
38
|
+
to: { empty: :empty, omitted: :omitted, nil: :nil }
|
39
|
+
}
|
40
|
+
map_element "element", to: :element
|
41
|
+
map_element "attribute", to: :attribute
|
42
|
+
map_element "ref", to: :ref
|
43
|
+
map_element "choice", to: :choice
|
44
|
+
map_element "group", to: :group
|
45
|
+
map_element "interleave", to: :interleave
|
46
|
+
map_element "mixed", to: :mixed
|
47
|
+
map_element "optional", to: :optional
|
48
|
+
map_element "zeroOrMore", to: :zeroOrMore
|
49
|
+
map_element "oneOrMore", to: :oneOrMore
|
50
|
+
map_element "text", to: :text
|
51
|
+
map_element "empty", to: :empty
|
52
|
+
map_element "value", to: :value
|
53
|
+
map_element "data", to: :data
|
54
|
+
map_element "list", to: :list
|
55
|
+
map_element "notAllowed", to: :notAllowed
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
data/lib/rng.rb
CHANGED
@@ -1,12 +1,36 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
require "lutaml/model"
|
4
|
+
require "lutaml/model/xml_adapter/nokogiri_adapter"
|
5
|
+
|
6
|
+
Lutaml::Model::Config.configure do |config|
|
7
|
+
config.xml_adapter = Lutaml::Model::XmlAdapter::NokogiriAdapter
|
8
|
+
end
|
7
9
|
|
8
10
|
module Rng
|
9
11
|
class Error < StandardError; end
|
12
|
+
end
|
13
|
+
|
14
|
+
require "zeitwerk"
|
15
|
+
loader = Zeitwerk::Loader.for_gem
|
16
|
+
loader.setup # ready!
|
17
|
+
|
18
|
+
loader.eager_load
|
19
|
+
|
20
|
+
module Rng
|
21
|
+
module_function
|
22
|
+
|
23
|
+
def parse(rng, location: nil, nested_schema: false)
|
24
|
+
Grammar.from_xml(rng)
|
25
|
+
end
|
26
|
+
|
27
|
+
def parse_rnc(rnc)
|
28
|
+
# Parse RNC and convert to RNG
|
29
|
+
ParseRnc.parse(rnc)
|
30
|
+
end
|
10
31
|
|
11
|
-
|
32
|
+
def to_rnc(schema)
|
33
|
+
# Convert RNG schema to RNC
|
34
|
+
ToRnc.convert(schema)
|
35
|
+
end
|
12
36
|
end
|
data/rng.gemspec
CHANGED
@@ -23,15 +23,16 @@ Gem::Specification.new do |spec|
|
|
23
23
|
|
24
24
|
# Specify which files should be added to the gem when it is released.
|
25
25
|
spec.files = all_files_in_git
|
26
|
-
|
26
|
+
.reject { |f| f.match(%r{\A(?:test|features|bin|\.)/}) }
|
27
27
|
|
28
28
|
spec.bindir = "exe"
|
29
29
|
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
30
30
|
spec.require_paths = ["lib"]
|
31
31
|
|
32
32
|
spec.add_dependency "lutaml-model"
|
33
|
-
spec.add_dependency "parslet"
|
34
33
|
spec.add_dependency "nokogiri"
|
34
|
+
spec.add_dependency "parslet"
|
35
|
+
spec.add_dependency "zeitwerk"
|
35
36
|
|
36
37
|
# spec.add_dependency "thor"
|
37
38
|
spec.metadata["rubygems_mfa_required"] = "true"
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# A more complex RNC example demonstrating various RELAX NG features
|
2
|
+
|
3
|
+
# Default namespace
|
4
|
+
default namespace = "http://example.com/complex"
|
5
|
+
|
6
|
+
# Grammar with namespace definitions
|
7
|
+
grammar {
|
8
|
+
start = element document {
|
9
|
+
attribute version { "1.0" },
|
10
|
+
attribute xmlns { "http://example.com/complex" }?,
|
11
|
+
|
12
|
+
# Mixed content with interleaved elements
|
13
|
+
mixed {
|
14
|
+
element title { text },
|
15
|
+
element metadata {
|
16
|
+
attribute created { xsd:date },
|
17
|
+
attribute modified { xsd:date }?
|
18
|
+
},
|
19
|
+
|
20
|
+
# Choice between section types
|
21
|
+
(normalSection | specialSection)+
|
22
|
+
}
|
23
|
+
}
|
24
|
+
|
25
|
+
# Define a normal section pattern
|
26
|
+
normalSection =
|
27
|
+
element section {
|
28
|
+
attribute id { xsd:ID },
|
29
|
+
element heading { text },
|
30
|
+
|
31
|
+
# Zero or more paragraphs
|
32
|
+
element para {
|
33
|
+
# Allow mixed content with formatting
|
34
|
+
mixed { formatting* }
|
35
|
+
}*
|
36
|
+
}
|
37
|
+
|
38
|
+
# Define a special section with different content model
|
39
|
+
specialSection =
|
40
|
+
element specialSection {
|
41
|
+
attribute type { "note" | "warning" | "tip" },
|
42
|
+
element heading { text },
|
43
|
+
|
44
|
+
# One or more items in a list
|
45
|
+
element list {
|
46
|
+
element item {
|
47
|
+
mixed { formatting* }
|
48
|
+
}+
|
49
|
+
}
|
50
|
+
}
|
51
|
+
|
52
|
+
# Inline formatting elements (used in mixed content)
|
53
|
+
formatting =
|
54
|
+
element em { text } |
|
55
|
+
element strong { text } |
|
56
|
+
element code { text } |
|
57
|
+
element link {
|
58
|
+
attribute href { xsd:anyURI },
|
59
|
+
text
|
60
|
+
}
|
61
|
+
}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<grammar xmlns="http://relaxng.org/ns/structure/1.0">
|
3
|
+
<start>
|
4
|
+
<element name="addressBook">
|
5
|
+
<zeroOrMore>
|
6
|
+
<element name="card">
|
7
|
+
<ref name="cardContent"/>
|
8
|
+
</element>
|
9
|
+
</zeroOrMore>
|
10
|
+
</element>
|
11
|
+
</start>
|
12
|
+
<define name="cardContent">
|
13
|
+
<element name="name">
|
14
|
+
<text/>
|
15
|
+
</element>
|
16
|
+
<element name="email">
|
17
|
+
<text/>
|
18
|
+
</element>
|
19
|
+
</define>
|
20
|
+
</grammar>
|
@@ -0,0 +1,335 @@
|
|
1
|
+
<?xml version="1.0"?>
|
2
|
+
<!-- RELAX NG for RELAX NG -->
|
3
|
+
<!-- $Id: relaxng.rng,v 1.31 2002/05/30 06:07:43 jjc Exp $ -->
|
4
|
+
<grammar datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"
|
5
|
+
ns="http://relaxng.org/ns/structure/1.0"
|
6
|
+
xmlns="http://relaxng.org/ns/structure/1.0">
|
7
|
+
<start>
|
8
|
+
<ref name="pattern"/>
|
9
|
+
</start>
|
10
|
+
|
11
|
+
<define name="pattern">
|
12
|
+
<choice>
|
13
|
+
<element name="element">
|
14
|
+
<choice>
|
15
|
+
<attribute name="name">
|
16
|
+
<data type="QName"/>
|
17
|
+
</attribute>
|
18
|
+
<ref name="open-name-class"/>
|
19
|
+
</choice>
|
20
|
+
<ref name="common-atts"/>
|
21
|
+
<ref name="open-patterns"/>
|
22
|
+
</element>
|
23
|
+
<element name="attribute">
|
24
|
+
<ref name="common-atts"/>
|
25
|
+
<choice>
|
26
|
+
<attribute name="name">
|
27
|
+
<data type="QName"/>
|
28
|
+
</attribute>
|
29
|
+
<ref name="open-name-class"/>
|
30
|
+
</choice>
|
31
|
+
<interleave>
|
32
|
+
<ref name="other"/>
|
33
|
+
<optional>
|
34
|
+
<ref name="pattern"/>
|
35
|
+
</optional>
|
36
|
+
</interleave>
|
37
|
+
</element>
|
38
|
+
<element name="group">
|
39
|
+
<ref name="common-atts"/>
|
40
|
+
<ref name="open-patterns"/>
|
41
|
+
</element>
|
42
|
+
<element name="interleave">
|
43
|
+
<ref name="common-atts"/>
|
44
|
+
<ref name="open-patterns"/>
|
45
|
+
</element>
|
46
|
+
<element name="choice">
|
47
|
+
<ref name="common-atts"/>
|
48
|
+
<ref name="open-patterns"/>
|
49
|
+
</element>
|
50
|
+
<element name="optional">
|
51
|
+
<ref name="common-atts"/>
|
52
|
+
<ref name="open-patterns"/>
|
53
|
+
</element>
|
54
|
+
<element name="zeroOrMore">
|
55
|
+
<ref name="common-atts"/>
|
56
|
+
<ref name="open-patterns"/>
|
57
|
+
</element>
|
58
|
+
<element name="oneOrMore">
|
59
|
+
<ref name="common-atts"/>
|
60
|
+
<ref name="open-patterns"/>
|
61
|
+
</element>
|
62
|
+
<element name="list">
|
63
|
+
<ref name="common-atts"/>
|
64
|
+
<ref name="open-patterns"/>
|
65
|
+
</element>
|
66
|
+
<element name="mixed">
|
67
|
+
<ref name="common-atts"/>
|
68
|
+
<ref name="open-patterns"/>
|
69
|
+
</element>
|
70
|
+
<element name="ref">
|
71
|
+
<attribute name="name">
|
72
|
+
<data type="NCName"/>
|
73
|
+
</attribute>
|
74
|
+
<ref name="common-atts"/>
|
75
|
+
<ref name="other"/>
|
76
|
+
</element>
|
77
|
+
<element name="parentRef">
|
78
|
+
<attribute name="name">
|
79
|
+
<data type="NCName"/>
|
80
|
+
</attribute>
|
81
|
+
<ref name="common-atts"/>
|
82
|
+
<ref name="other"/>
|
83
|
+
</element>
|
84
|
+
<element name="empty">
|
85
|
+
<ref name="common-atts"/>
|
86
|
+
<ref name="other"/>
|
87
|
+
</element>
|
88
|
+
<element name="text">
|
89
|
+
<ref name="common-atts"/>
|
90
|
+
<ref name="other"/>
|
91
|
+
</element>
|
92
|
+
<element name="value">
|
93
|
+
<optional>
|
94
|
+
<attribute name="type">
|
95
|
+
<data type="NCName"/>
|
96
|
+
</attribute>
|
97
|
+
</optional>
|
98
|
+
<ref name="common-atts"/>
|
99
|
+
<text/>
|
100
|
+
</element>
|
101
|
+
<element name="data">
|
102
|
+
<attribute name="type">
|
103
|
+
<data type="NCName"/>
|
104
|
+
</attribute>
|
105
|
+
<ref name="common-atts"/>
|
106
|
+
<interleave>
|
107
|
+
<ref name="other"/>
|
108
|
+
<group>
|
109
|
+
<zeroOrMore>
|
110
|
+
<element name="param">
|
111
|
+
<attribute name="name">
|
112
|
+
<data type="NCName"/>
|
113
|
+
</attribute>
|
114
|
+
<ref name="common-atts"/>
|
115
|
+
<text/>
|
116
|
+
</element>
|
117
|
+
</zeroOrMore>
|
118
|
+
<optional>
|
119
|
+
<element name="except">
|
120
|
+
<ref name="common-atts"/>
|
121
|
+
<ref name="open-patterns"/>
|
122
|
+
</element>
|
123
|
+
</optional>
|
124
|
+
</group>
|
125
|
+
</interleave>
|
126
|
+
</element>
|
127
|
+
<element name="notAllowed">
|
128
|
+
<ref name="common-atts"/>
|
129
|
+
<ref name="other"/>
|
130
|
+
</element>
|
131
|
+
<element name="externalRef">
|
132
|
+
<attribute name="href">
|
133
|
+
<data type="anyURI"/>
|
134
|
+
</attribute>
|
135
|
+
<ref name="common-atts"/>
|
136
|
+
<ref name="other"/>
|
137
|
+
</element>
|
138
|
+
<element name="grammar">
|
139
|
+
<ref name="common-atts"/>
|
140
|
+
<ref name="grammar-content"/>
|
141
|
+
</element>
|
142
|
+
</choice>
|
143
|
+
</define>
|
144
|
+
|
145
|
+
<define name="grammar-content">
|
146
|
+
<interleave>
|
147
|
+
<ref name="other"/>
|
148
|
+
<zeroOrMore>
|
149
|
+
<choice>
|
150
|
+
<ref name="start-element"/>
|
151
|
+
<ref name="define-element"/>
|
152
|
+
<element name="div">
|
153
|
+
<ref name="common-atts"/>
|
154
|
+
<ref name="grammar-content"/>
|
155
|
+
</element>
|
156
|
+
<element name="include">
|
157
|
+
<attribute name="href">
|
158
|
+
<data type="anyURI"/>
|
159
|
+
</attribute>
|
160
|
+
<ref name="common-atts"/>
|
161
|
+
<ref name="include-content"/>
|
162
|
+
</element>
|
163
|
+
</choice>
|
164
|
+
</zeroOrMore>
|
165
|
+
</interleave>
|
166
|
+
</define>
|
167
|
+
|
168
|
+
<define name="include-content">
|
169
|
+
<interleave>
|
170
|
+
<ref name="other"/>
|
171
|
+
<zeroOrMore>
|
172
|
+
<choice>
|
173
|
+
<ref name="start-element"/>
|
174
|
+
<ref name="define-element"/>
|
175
|
+
<element name="div">
|
176
|
+
<ref name="common-atts"/>
|
177
|
+
<ref name="include-content"/>
|
178
|
+
</element>
|
179
|
+
</choice>
|
180
|
+
</zeroOrMore>
|
181
|
+
</interleave>
|
182
|
+
</define>
|
183
|
+
|
184
|
+
<define name="start-element">
|
185
|
+
<element name="start">
|
186
|
+
<ref name="combine-att"/>
|
187
|
+
<ref name="common-atts"/>
|
188
|
+
<ref name="open-pattern"/>
|
189
|
+
</element>
|
190
|
+
</define>
|
191
|
+
|
192
|
+
<define name="define-element">
|
193
|
+
<element name="define">
|
194
|
+
<attribute name="name">
|
195
|
+
<data type="NCName"/>
|
196
|
+
</attribute>
|
197
|
+
<ref name="combine-att"/>
|
198
|
+
<ref name="common-atts"/>
|
199
|
+
<ref name="open-patterns"/>
|
200
|
+
</element>
|
201
|
+
</define>
|
202
|
+
|
203
|
+
<define name="combine-att">
|
204
|
+
<optional>
|
205
|
+
<attribute name="combine">
|
206
|
+
<choice>
|
207
|
+
<value>choice</value>
|
208
|
+
<value>interleave</value>
|
209
|
+
</choice>
|
210
|
+
</attribute>
|
211
|
+
</optional>
|
212
|
+
</define>
|
213
|
+
|
214
|
+
<define name="open-patterns">
|
215
|
+
<interleave>
|
216
|
+
<ref name="other"/>
|
217
|
+
<oneOrMore>
|
218
|
+
<ref name="pattern"/>
|
219
|
+
</oneOrMore>
|
220
|
+
</interleave>
|
221
|
+
</define>
|
222
|
+
|
223
|
+
<define name="open-pattern">
|
224
|
+
<interleave>
|
225
|
+
<ref name="other"/>
|
226
|
+
<ref name="pattern"/>
|
227
|
+
</interleave>
|
228
|
+
</define>
|
229
|
+
|
230
|
+
<define name="name-class">
|
231
|
+
<choice>
|
232
|
+
<element name="name">
|
233
|
+
<ref name="common-atts"/>
|
234
|
+
<data type="QName"/>
|
235
|
+
</element>
|
236
|
+
<element name="anyName">
|
237
|
+
<ref name="common-atts"/>
|
238
|
+
<ref name="except-name-class"/>
|
239
|
+
</element>
|
240
|
+
<element name="nsName">
|
241
|
+
<ref name="common-atts"/>
|
242
|
+
<ref name="except-name-class"/>
|
243
|
+
</element>
|
244
|
+
<element name="choice">
|
245
|
+
<ref name="common-atts"/>
|
246
|
+
<ref name="open-name-classes"/>
|
247
|
+
</element>
|
248
|
+
</choice>
|
249
|
+
</define>
|
250
|
+
|
251
|
+
<define name="except-name-class">
|
252
|
+
<interleave>
|
253
|
+
<ref name="other"/>
|
254
|
+
<optional>
|
255
|
+
<element name="except">
|
256
|
+
<ref name="open-name-classes"/>
|
257
|
+
</element>
|
258
|
+
</optional>
|
259
|
+
</interleave>
|
260
|
+
</define>
|
261
|
+
|
262
|
+
<define name="open-name-classes">
|
263
|
+
<interleave>
|
264
|
+
<ref name="other"/>
|
265
|
+
<oneOrMore>
|
266
|
+
<ref name="name-class"/>
|
267
|
+
</oneOrMore>
|
268
|
+
</interleave>
|
269
|
+
</define>
|
270
|
+
|
271
|
+
<define name="open-name-class">
|
272
|
+
<interleave>
|
273
|
+
<ref name="other"/>
|
274
|
+
<ref name="name-class"/>
|
275
|
+
</interleave>
|
276
|
+
</define>
|
277
|
+
|
278
|
+
<define name="common-atts">
|
279
|
+
<optional>
|
280
|
+
<attribute name="ns"/>
|
281
|
+
</optional>
|
282
|
+
<optional>
|
283
|
+
<attribute name="datatypeLibrary">
|
284
|
+
<data type="anyURI"/>
|
285
|
+
</attribute>
|
286
|
+
</optional>
|
287
|
+
<zeroOrMore>
|
288
|
+
<attribute>
|
289
|
+
<anyName>
|
290
|
+
<except>
|
291
|
+
<nsName/>
|
292
|
+
<nsName ns=""/>
|
293
|
+
</except>
|
294
|
+
</anyName>
|
295
|
+
</attribute>
|
296
|
+
</zeroOrMore>
|
297
|
+
</define>
|
298
|
+
|
299
|
+
<define name="other">
|
300
|
+
<zeroOrMore>
|
301
|
+
<element>
|
302
|
+
<anyName>
|
303
|
+
<except>
|
304
|
+
<nsName/>
|
305
|
+
</except>
|
306
|
+
</anyName>
|
307
|
+
<zeroOrMore>
|
308
|
+
<choice>
|
309
|
+
<attribute>
|
310
|
+
<anyName/>
|
311
|
+
</attribute>
|
312
|
+
<text/>
|
313
|
+
<ref name="any"/>
|
314
|
+
</choice>
|
315
|
+
</zeroOrMore>
|
316
|
+
</element>
|
317
|
+
</zeroOrMore>
|
318
|
+
</define>
|
319
|
+
|
320
|
+
<define name="any">
|
321
|
+
<element>
|
322
|
+
<anyName/>
|
323
|
+
<zeroOrMore>
|
324
|
+
<choice>
|
325
|
+
<attribute>
|
326
|
+
<anyName/>
|
327
|
+
</attribute>
|
328
|
+
<text/>
|
329
|
+
<ref name="any"/>
|
330
|
+
</choice>
|
331
|
+
</zeroOrMore>
|
332
|
+
</element>
|
333
|
+
</define>
|
334
|
+
|
335
|
+
</grammar>
|