duxml 0.8.8 → 0.8.9
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/bin/validate_xml +30 -30
- data/lib/duxml.rb +76 -76
- data/lib/duxml/doc.rb +108 -91
- data/lib/duxml/doc/element.rb +250 -250
- data/lib/duxml/doc/lazy_ox.rb +167 -167
- data/lib/duxml/doc/node_set.rb +38 -38
- data/lib/duxml/meta.rb +72 -72
- data/lib/duxml/meta/grammar.rb +133 -133
- data/lib/duxml/meta/grammar/pattern.rb +111 -111
- data/lib/duxml/meta/grammar/pattern/attr_name_pattern.rb +36 -36
- data/lib/duxml/meta/grammar/pattern/attr_val_pattern.rb +36 -36
- data/lib/duxml/meta/grammar/pattern/child_pattern.rb +60 -60
- data/lib/duxml/meta/grammar/pattern/text_pattern.rb +31 -31
- data/lib/duxml/meta/grammar/pattern_maker.rb +68 -68
- data/lib/duxml/meta/grammar/relax_ng.rb +39 -39
- data/lib/duxml/meta/grammar/relax_ng/attrs_rule.rb +58 -58
- data/lib/duxml/meta/grammar/relax_ng/children_rule.rb +82 -82
- data/lib/duxml/meta/grammar/relax_ng/value_rule.rb +44 -44
- data/lib/duxml/meta/grammar/rule.rb +58 -58
- data/lib/duxml/meta/grammar/rule/attrs_rule.rb +77 -77
- data/lib/duxml/meta/grammar/rule/children_rule.rb +135 -135
- data/lib/duxml/meta/grammar/rule/text_rule.rb +39 -39
- data/lib/duxml/meta/grammar/rule/value_rule.rb +110 -110
- data/lib/duxml/meta/grammar/spreadsheet.rb +34 -34
- data/lib/duxml/meta/history.rb +88 -88
- data/lib/duxml/meta/history/add.rb +30 -30
- data/lib/duxml/meta/history/change.rb +70 -70
- data/lib/duxml/meta/history/change_attr.rb +33 -33
- data/lib/duxml/meta/history/change_text.rb +32 -32
- data/lib/duxml/meta/history/error.rb +24 -24
- data/lib/duxml/meta/history/new_attr.rb +32 -32
- data/lib/duxml/meta/history/new_text.rb +36 -36
- data/lib/duxml/meta/history/qualify_error.rb +21 -21
- data/lib/duxml/meta/history/remove.rb +27 -27
- data/lib/duxml/meta/history/undo.rb +23 -23
- data/lib/duxml/meta/history/validate_error.rb +20 -20
- data/lib/duxml/reportable.rb +28 -28
- data/lib/duxml/ruby_ext/fixnum.rb +55 -55
- data/lib/duxml/ruby_ext/module.rb +11 -11
- data/lib/duxml/ruby_ext/object.rb +13 -13
- data/lib/duxml/ruby_ext/regexp.rb +19 -19
- data/lib/duxml/ruby_ext/string.rb +37 -37
- data/lib/duxml/saxer.rb +75 -75
- metadata +12 -12
@@ -1,40 +1,40 @@
|
|
1
|
-
# Copyright (c) 2016 Freescale Semiconductor Inc.
|
2
|
-
|
3
|
-
require File.expand_path(File.dirname(__FILE__) + '/relax_ng/children_rule')
|
4
|
-
require File.expand_path(File.dirname(__FILE__) + '/relax_ng/attrs_rule')
|
5
|
-
require File.expand_path(File.dirname(__FILE__) + '/relax_ng/value_rule')
|
6
|
-
require File.expand_path(File.dirname(__FILE__) + '/../../doc')
|
7
|
-
|
8
|
-
module Duxml
|
9
|
-
# contains methods to convert Rules into a valid RelaxNG schema file
|
10
|
-
module RelaxNG
|
11
|
-
include Duxml
|
12
|
-
# @param output_path [String] optional, output path for .rng file
|
13
|
-
# @return [Nokogiri::XML::RelaxNG] RelaxNG schema object
|
14
|
-
def relaxng(output_path=nil)
|
15
|
-
doc = Doc.new
|
16
|
-
doc << Element.new('grammar')
|
17
|
-
doc.grammar[:xmlns] = 'http://relaxng.org/ns/structure/1.0'
|
18
|
-
doc.grammar[:datatypeLibrary] = 'http://www.w3.org/2001/XMLSchema-datatypes'
|
19
|
-
start = Element.new('start')
|
20
|
-
start[:combine] = 'choice'
|
21
|
-
ref = Element.new('ref')
|
22
|
-
ref[:name] = rules.first.subject
|
23
|
-
start << ref
|
24
|
-
doc.grammar << start
|
25
|
-
rules.each do |rule|
|
26
|
-
rule.relaxng doc.grammar
|
27
|
-
end
|
28
|
-
|
29
|
-
# fill in empty doc definitions to make them legal
|
30
|
-
element_defs = doc.grammar.Define.collect do |d|
|
31
|
-
d.element if d.nodes.first.name == 'element' and d.element.nodes.empty?
|
32
|
-
end.compact
|
33
|
-
element_defs.each do |element_def|
|
34
|
-
element_def << Element.new('empty')
|
35
|
-
end
|
36
|
-
doc.write_to output_path if output_path
|
37
|
-
doc
|
38
|
-
end # def relaxng
|
39
|
-
end # module RelaxNG
|
1
|
+
# Copyright (c) 2016 Freescale Semiconductor Inc.
|
2
|
+
|
3
|
+
require File.expand_path(File.dirname(__FILE__) + '/relax_ng/children_rule')
|
4
|
+
require File.expand_path(File.dirname(__FILE__) + '/relax_ng/attrs_rule')
|
5
|
+
require File.expand_path(File.dirname(__FILE__) + '/relax_ng/value_rule')
|
6
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../doc')
|
7
|
+
|
8
|
+
module Duxml
|
9
|
+
# contains methods to convert Rules into a valid RelaxNG schema file
|
10
|
+
module RelaxNG
|
11
|
+
include Duxml
|
12
|
+
# @param output_path [String] optional, output path for .rng file
|
13
|
+
# @return [Nokogiri::XML::RelaxNG] RelaxNG schema object
|
14
|
+
def relaxng(output_path=nil)
|
15
|
+
doc = Doc.new
|
16
|
+
doc << Element.new('grammar')
|
17
|
+
doc.grammar[:xmlns] = 'http://relaxng.org/ns/structure/1.0'
|
18
|
+
doc.grammar[:datatypeLibrary] = 'http://www.w3.org/2001/XMLSchema-datatypes'
|
19
|
+
start = Element.new('start')
|
20
|
+
start[:combine] = 'choice'
|
21
|
+
ref = Element.new('ref')
|
22
|
+
ref[:name] = rules.first.subject
|
23
|
+
start << ref
|
24
|
+
doc.grammar << start
|
25
|
+
rules.each do |rule|
|
26
|
+
rule.relaxng doc.grammar
|
27
|
+
end
|
28
|
+
|
29
|
+
# fill in empty doc definitions to make them legal
|
30
|
+
element_defs = doc.grammar.Define.collect do |d|
|
31
|
+
d.element if d.nodes.first.name == 'element' and d.element.nodes.empty?
|
32
|
+
end.compact
|
33
|
+
element_defs.each do |element_def|
|
34
|
+
element_def << Element.new('empty')
|
35
|
+
end
|
36
|
+
doc.write_to output_path if output_path
|
37
|
+
doc
|
38
|
+
end # def relaxng
|
39
|
+
end # module RelaxNG
|
40
40
|
end # module Duxml
|
@@ -1,58 +1,58 @@
|
|
1
|
-
# Copyright (c) 2016 Freescale Semiconductor Inc.
|
2
|
-
|
3
|
-
require File.expand_path(File.dirname(__FILE__) + '/../rule/attrs_rule')
|
4
|
-
require File.expand_path(File.dirname(__FILE__) + '/../../../doc/lazy_ox')
|
5
|
-
require 'ox'
|
6
|
-
|
7
|
-
module Duxml
|
8
|
-
module RngAttrsRule; end
|
9
|
-
|
10
|
-
class AttrsRuleClass
|
11
|
-
include RngAttrsRule
|
12
|
-
end
|
13
|
-
|
14
|
-
module RngAttrsRule
|
15
|
-
include Duxml::LazyOx
|
16
|
-
include Ox
|
17
|
-
|
18
|
-
# @param parent [Nokogiri::XML::Node] should be <grammar>
|
19
|
-
# @return [Nokogiri::XML::Node] parent, but with additions of <define><attribute> to parent if does not already exist and <ref> to respective <define><doc>
|
20
|
-
def relaxng(parent)
|
21
|
-
# TODO this is here just to skip generation from namespaced attributes - fix later!!!
|
22
|
-
return parent if attr_name.include?(':')
|
23
|
-
# TODO
|
24
|
-
|
25
|
-
# if new attribute declaration needed
|
26
|
-
unless parent.Define(name: attr_name).any?
|
27
|
-
new_def = Element.new('define')
|
28
|
-
new_def[:name] = attr_name
|
29
|
-
new_attr_def = Element.new('attribute')
|
30
|
-
new_attr_def[:name] = attr_name
|
31
|
-
new_def << new_attr_def
|
32
|
-
parent << new_def
|
33
|
-
end
|
34
|
-
|
35
|
-
# update doc with ref, updating previous <optional> if available
|
36
|
-
parent.nodes.reverse.each do |define|
|
37
|
-
if define[:name] == subject
|
38
|
-
element_def = define.nodes.first
|
39
|
-
if requirement == '#REQUIRED'
|
40
|
-
cur_element = element_def
|
41
|
-
else
|
42
|
-
if element_def.nodes.any? and element_def.nodes.last.name == 'optional'
|
43
|
-
cur_element = element_def.nodes.last
|
44
|
-
else
|
45
|
-
cur_element = Element.new('optional')
|
46
|
-
element_def << cur_element
|
47
|
-
end
|
48
|
-
end # if self[:requirement]=='#REQUIRED'
|
49
|
-
new_ref = Element.new('ref')
|
50
|
-
new_ref[:name] = attr_name
|
51
|
-
cur_element << new_ref
|
52
|
-
break
|
53
|
-
end # if define[:name] == subject
|
54
|
-
end # parent.element_children.any?
|
55
|
-
parent
|
56
|
-
end # def relaxng(parent)
|
57
|
-
end # module RngAttrsRule
|
58
|
-
end # module Duxml
|
1
|
+
# Copyright (c) 2016 Freescale Semiconductor Inc.
|
2
|
+
|
3
|
+
require File.expand_path(File.dirname(__FILE__) + '/../rule/attrs_rule')
|
4
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../../doc/lazy_ox')
|
5
|
+
require 'ox'
|
6
|
+
|
7
|
+
module Duxml
|
8
|
+
module RngAttrsRule; end
|
9
|
+
|
10
|
+
class AttrsRuleClass
|
11
|
+
include RngAttrsRule
|
12
|
+
end
|
13
|
+
|
14
|
+
module RngAttrsRule
|
15
|
+
include Duxml::LazyOx
|
16
|
+
include Ox
|
17
|
+
|
18
|
+
# @param parent [Nokogiri::XML::Node] should be <grammar>
|
19
|
+
# @return [Nokogiri::XML::Node] parent, but with additions of <define><attribute> to parent if does not already exist and <ref> to respective <define><doc>
|
20
|
+
def relaxng(parent)
|
21
|
+
# TODO this is here just to skip generation from namespaced attributes - fix later!!!
|
22
|
+
return parent if attr_name.include?(':')
|
23
|
+
# TODO
|
24
|
+
|
25
|
+
# if new attribute declaration needed
|
26
|
+
unless parent.Define(name: attr_name).any?
|
27
|
+
new_def = Element.new('define')
|
28
|
+
new_def[:name] = attr_name
|
29
|
+
new_attr_def = Element.new('attribute')
|
30
|
+
new_attr_def[:name] = attr_name
|
31
|
+
new_def << new_attr_def
|
32
|
+
parent << new_def
|
33
|
+
end
|
34
|
+
|
35
|
+
# update doc with ref, updating previous <optional> if available
|
36
|
+
parent.nodes.reverse.each do |define|
|
37
|
+
if define[:name] == subject
|
38
|
+
element_def = define.nodes.first
|
39
|
+
if requirement == '#REQUIRED'
|
40
|
+
cur_element = element_def
|
41
|
+
else
|
42
|
+
if element_def.nodes.any? and element_def.nodes.last.name == 'optional'
|
43
|
+
cur_element = element_def.nodes.last
|
44
|
+
else
|
45
|
+
cur_element = Element.new('optional')
|
46
|
+
element_def << cur_element
|
47
|
+
end
|
48
|
+
end # if self[:requirement]=='#REQUIRED'
|
49
|
+
new_ref = Element.new('ref')
|
50
|
+
new_ref[:name] = attr_name
|
51
|
+
cur_element << new_ref
|
52
|
+
break
|
53
|
+
end # if define[:name] == subject
|
54
|
+
end # parent.element_children.any?
|
55
|
+
parent
|
56
|
+
end # def relaxng(parent)
|
57
|
+
end # module RngAttrsRule
|
58
|
+
end # module Duxml
|
@@ -1,83 +1,83 @@
|
|
1
|
-
# Copyright (c) 2016 Freescale Semiconductor Inc.
|
2
|
-
|
3
|
-
require File.expand_path(File.dirname(__FILE__) + '/../rule/children_rule')
|
4
|
-
|
5
|
-
module Duxml
|
6
|
-
module RngChildrenRule; end
|
7
|
-
|
8
|
-
class ChildrenRuleClass
|
9
|
-
include RngChildrenRule
|
10
|
-
end
|
11
|
-
|
12
|
-
module RngChildrenRule
|
13
|
-
include Duxml::LazyOx
|
14
|
-
include Ox
|
15
|
-
|
16
|
-
# @param parent [Ox::Element] parent from RelaxNG document under construction (should be <grammar/>)
|
17
|
-
# @return [Ox::Element] same parent but with addition of <define><doc> with #statement converted into <ref>'s
|
18
|
-
# these are wrapped as needed in <zeroOrMore>,<oneOrMore>, or <optional>
|
19
|
-
def relaxng(parent)
|
20
|
-
nodes = parent.Define(name: subject)
|
21
|
-
raise Exception if nodes.size > 1
|
22
|
-
|
23
|
-
if nodes.first.nil?
|
24
|
-
element_def = Element.new('element')
|
25
|
-
element_def[:name] = subject
|
26
|
-
define = Element.new('define')
|
27
|
-
define[:name] = subject
|
28
|
-
define << element_def
|
29
|
-
parent << define
|
30
|
-
else
|
31
|
-
element_def = nodes.first.nodes.first
|
32
|
-
end
|
33
|
-
|
34
|
-
# loop through child requirements
|
35
|
-
get_scanners.each do |scanner|
|
36
|
-
# wrap in requirement node if needed
|
37
|
-
operator_name = case scanner[:operator]
|
38
|
-
when '?' then :optional
|
39
|
-
when '*' then :zeroOrMore
|
40
|
-
when '+' then :oneOrMore
|
41
|
-
else nil
|
42
|
-
end
|
43
|
-
if operator_name
|
44
|
-
cur_element = Element.new(operator_name.to_s)
|
45
|
-
element_def << cur_element
|
46
|
-
else
|
47
|
-
cur_element = element_def
|
48
|
-
end
|
49
|
-
|
50
|
-
# if child requirement has enumerated options, wrap in <choice>
|
51
|
-
element_array = scanner[:match].source.gsub('\b','').scan(Regexp.nmtoken).flatten.keep_if do |e| !e.empty? end
|
52
|
-
if element_array.size > 1
|
53
|
-
choice_el = Element.new 'choice'
|
54
|
-
cur_element << choice_el
|
55
|
-
cur_element = choice_el
|
56
|
-
end
|
57
|
-
|
58
|
-
# adding enumerated options as new element defs if needed
|
59
|
-
element_array.each do |element_name|
|
60
|
-
existing_defs = parent.Define(name: element_name)
|
61
|
-
raise Exception if existing_defs.size > 1
|
62
|
-
if existing_defs.empty?
|
63
|
-
new_def = Element.new('define')
|
64
|
-
new_def[:name] = element_name
|
65
|
-
child_el_def = Element.new('element')
|
66
|
-
child_el_def[:name] = element_name
|
67
|
-
new_def << child_el_def
|
68
|
-
parent << new_def
|
69
|
-
end
|
70
|
-
|
71
|
-
if element_name == '#PCDATA'
|
72
|
-
cur_element << Element.new('text')
|
73
|
-
else
|
74
|
-
ref_node = Element.new('ref')
|
75
|
-
ref_node[:name] = element_name
|
76
|
-
cur_element << ref_node
|
77
|
-
end
|
78
|
-
end # element_array.each
|
79
|
-
end # get_scanners.each
|
80
|
-
parent
|
81
|
-
end # def relaxng
|
82
|
-
end # module RngChildrenRule
|
1
|
+
# Copyright (c) 2016 Freescale Semiconductor Inc.
|
2
|
+
|
3
|
+
require File.expand_path(File.dirname(__FILE__) + '/../rule/children_rule')
|
4
|
+
|
5
|
+
module Duxml
|
6
|
+
module RngChildrenRule; end
|
7
|
+
|
8
|
+
class ChildrenRuleClass
|
9
|
+
include RngChildrenRule
|
10
|
+
end
|
11
|
+
|
12
|
+
module RngChildrenRule
|
13
|
+
include Duxml::LazyOx
|
14
|
+
include Ox
|
15
|
+
|
16
|
+
# @param parent [Ox::Element] parent from RelaxNG document under construction (should be <grammar/>)
|
17
|
+
# @return [Ox::Element] same parent but with addition of <define><doc> with #statement converted into <ref>'s
|
18
|
+
# these are wrapped as needed in <zeroOrMore>,<oneOrMore>, or <optional>
|
19
|
+
def relaxng(parent)
|
20
|
+
nodes = parent.Define(name: subject)
|
21
|
+
raise Exception if nodes.size > 1
|
22
|
+
|
23
|
+
if nodes.first.nil?
|
24
|
+
element_def = Element.new('element')
|
25
|
+
element_def[:name] = subject
|
26
|
+
define = Element.new('define')
|
27
|
+
define[:name] = subject
|
28
|
+
define << element_def
|
29
|
+
parent << define
|
30
|
+
else
|
31
|
+
element_def = nodes.first.nodes.first
|
32
|
+
end
|
33
|
+
|
34
|
+
# loop through child requirements
|
35
|
+
get_scanners.each do |scanner|
|
36
|
+
# wrap in requirement node if needed
|
37
|
+
operator_name = case scanner[:operator]
|
38
|
+
when '?' then :optional
|
39
|
+
when '*' then :zeroOrMore
|
40
|
+
when '+' then :oneOrMore
|
41
|
+
else nil
|
42
|
+
end
|
43
|
+
if operator_name
|
44
|
+
cur_element = Element.new(operator_name.to_s)
|
45
|
+
element_def << cur_element
|
46
|
+
else
|
47
|
+
cur_element = element_def
|
48
|
+
end
|
49
|
+
|
50
|
+
# if child requirement has enumerated options, wrap in <choice>
|
51
|
+
element_array = scanner[:match].source.gsub('\b','').scan(Regexp.nmtoken).flatten.keep_if do |e| !e.empty? end
|
52
|
+
if element_array.size > 1
|
53
|
+
choice_el = Element.new 'choice'
|
54
|
+
cur_element << choice_el
|
55
|
+
cur_element = choice_el
|
56
|
+
end
|
57
|
+
|
58
|
+
# adding enumerated options as new element defs if needed
|
59
|
+
element_array.each do |element_name|
|
60
|
+
existing_defs = parent.Define(name: element_name)
|
61
|
+
raise Exception if existing_defs.size > 1
|
62
|
+
if existing_defs.empty?
|
63
|
+
new_def = Element.new('define')
|
64
|
+
new_def[:name] = element_name
|
65
|
+
child_el_def = Element.new('element')
|
66
|
+
child_el_def[:name] = element_name
|
67
|
+
new_def << child_el_def
|
68
|
+
parent << new_def
|
69
|
+
end
|
70
|
+
|
71
|
+
if element_name == '#PCDATA'
|
72
|
+
cur_element << Element.new('text')
|
73
|
+
else
|
74
|
+
ref_node = Element.new('ref')
|
75
|
+
ref_node[:name] = element_name
|
76
|
+
cur_element << ref_node
|
77
|
+
end
|
78
|
+
end # element_array.each
|
79
|
+
end # get_scanners.each
|
80
|
+
parent
|
81
|
+
end # def relaxng
|
82
|
+
end # module RngChildrenRule
|
83
83
|
end # module Duxml
|
@@ -1,44 +1,44 @@
|
|
1
|
-
# Copyright (c) 2016 Freescale Semiconductor Inc.
|
2
|
-
|
3
|
-
require File.expand_path(File.dirname(__FILE__) + '/../rule/value_rule')
|
4
|
-
|
5
|
-
module Duxml
|
6
|
-
module RngValueRule; end
|
7
|
-
|
8
|
-
class ValueRuleClass
|
9
|
-
include RngValueRule
|
10
|
-
end
|
11
|
-
|
12
|
-
module RngValueRule
|
13
|
-
include Duxml::LazyOx
|
14
|
-
# @param parent [Nokogiri::XML::Node] <grammar> i.e. parent node in RelaxNG document, NOT this Rule's document
|
15
|
-
# @return [Nokogiri::XML::Node] parent, but adds to corresponding <define><attribute> a child <data type="#{statement}">
|
16
|
-
# where #statement can be 'CDATA', 'NMTOKEN', etc.
|
17
|
-
def relaxng(parent)
|
18
|
-
parent.Define.each do |define|
|
19
|
-
if define[:name] == attr_name
|
20
|
-
attr_def = define.nodes.first
|
21
|
-
unless attr_def.nodes.any?
|
22
|
-
data_type = statement == 'CDATA' ? 'string' : statement
|
23
|
-
if data_type.include?('|')
|
24
|
-
choice_node = Element.new('choice')
|
25
|
-
attr_def << choice_node
|
26
|
-
data_type.split(/[\(\|\)]/).each do |en_val|
|
27
|
-
if !en_val.empty? && Regexp.nmtoken.match(en_val)
|
28
|
-
value_def = Element.new('value')
|
29
|
-
value_def << en_val
|
30
|
-
choice_node << value_def
|
31
|
-
end
|
32
|
-
end
|
33
|
-
else
|
34
|
-
data_def = Element.new('data')
|
35
|
-
data_def[:type] = data_type
|
36
|
-
attr_def << data_def
|
37
|
-
end
|
38
|
-
end # unless attr_def.nodes.any?
|
39
|
-
return parent
|
40
|
-
end # if define[:name] == attr_name
|
41
|
-
end # parent.nodes.each
|
42
|
-
end # def relaxng
|
43
|
-
end # module RngValuesRule
|
44
|
-
end # module Duxml
|
1
|
+
# Copyright (c) 2016 Freescale Semiconductor Inc.
|
2
|
+
|
3
|
+
require File.expand_path(File.dirname(__FILE__) + '/../rule/value_rule')
|
4
|
+
|
5
|
+
module Duxml
|
6
|
+
module RngValueRule; end
|
7
|
+
|
8
|
+
class ValueRuleClass
|
9
|
+
include RngValueRule
|
10
|
+
end
|
11
|
+
|
12
|
+
module RngValueRule
|
13
|
+
include Duxml::LazyOx
|
14
|
+
# @param parent [Nokogiri::XML::Node] <grammar> i.e. parent node in RelaxNG document, NOT this Rule's document
|
15
|
+
# @return [Nokogiri::XML::Node] parent, but adds to corresponding <define><attribute> a child <data type="#{statement}">
|
16
|
+
# where #statement can be 'CDATA', 'NMTOKEN', etc.
|
17
|
+
def relaxng(parent)
|
18
|
+
parent.Define.each do |define|
|
19
|
+
if define[:name] == attr_name
|
20
|
+
attr_def = define.nodes.first
|
21
|
+
unless attr_def.nodes.any?
|
22
|
+
data_type = statement == 'CDATA' ? 'string' : statement
|
23
|
+
if data_type.include?('|')
|
24
|
+
choice_node = Element.new('choice')
|
25
|
+
attr_def << choice_node
|
26
|
+
data_type.split(/[\(\|\)]/).each do |en_val|
|
27
|
+
if !en_val.empty? && Regexp.nmtoken.match(en_val)
|
28
|
+
value_def = Element.new('value')
|
29
|
+
value_def << en_val
|
30
|
+
choice_node << value_def
|
31
|
+
end
|
32
|
+
end
|
33
|
+
else
|
34
|
+
data_def = Element.new('data')
|
35
|
+
data_def[:type] = data_type
|
36
|
+
attr_def << data_def
|
37
|
+
end
|
38
|
+
end # unless attr_def.nodes.any?
|
39
|
+
return parent
|
40
|
+
end # if define[:name] == attr_name
|
41
|
+
end # parent.nodes.each
|
42
|
+
end # def relaxng
|
43
|
+
end # module RngValuesRule
|
44
|
+
end # module Duxml
|