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