xsd 1.0.0 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +11 -0
  3. data/Gemfile +9 -0
  4. data/README.md +14 -4
  5. data/lib/xsd/base_object.rb +43 -40
  6. data/lib/xsd/generator.rb +7 -7
  7. data/lib/xsd/objects/all.rb +2 -2
  8. data/lib/xsd/objects/annotation.rb +2 -2
  9. data/lib/xsd/objects/any.rb +2 -2
  10. data/lib/xsd/objects/any_attribute.rb +2 -2
  11. data/lib/xsd/objects/appinfo.rb +1 -1
  12. data/lib/xsd/objects/attribute.rb +9 -9
  13. data/lib/xsd/objects/attribute_group.rb +1 -1
  14. data/lib/xsd/objects/choice.rb +4 -4
  15. data/lib/xsd/objects/complex_content.rb +3 -3
  16. data/lib/xsd/objects/complex_type.rb +12 -12
  17. data/lib/xsd/objects/documentation.rb +2 -2
  18. data/lib/xsd/objects/element.rb +19 -19
  19. data/lib/xsd/objects/extension.rb +20 -1
  20. data/lib/xsd/objects/facet.rb +1 -1
  21. data/lib/xsd/objects/field.rb +1 -1
  22. data/lib/xsd/objects/group.rb +4 -4
  23. data/lib/xsd/objects/import.rb +15 -44
  24. data/lib/xsd/objects/include.rb +29 -0
  25. data/lib/xsd/objects/key.rb +3 -3
  26. data/lib/xsd/objects/keyref.rb +4 -4
  27. data/lib/xsd/objects/list.rb +1 -1
  28. data/lib/xsd/objects/restriction.rb +23 -3
  29. data/lib/xsd/objects/schema.rb +43 -37
  30. data/lib/xsd/objects/selector.rb +1 -1
  31. data/lib/xsd/objects/sequence.rb +4 -4
  32. data/lib/xsd/objects/simple_content.rb +2 -2
  33. data/lib/xsd/objects/simple_type.rb +5 -5
  34. data/lib/xsd/objects/union.rb +2 -2
  35. data/lib/xsd/objects/unique.rb +2 -2
  36. data/lib/xsd/shared/attribute_container.rb +2 -2
  37. data/lib/xsd/shared/based.rb +9 -9
  38. data/lib/xsd/shared/complex_typed.rb +7 -7
  39. data/lib/xsd/shared/element_container.rb +1 -1
  40. data/lib/xsd/shared/min_max_occurs.rb +4 -4
  41. data/lib/xsd/shared/referenced.rb +3 -3
  42. data/lib/xsd/shared/simple_typed.rb +1 -1
  43. data/lib/xsd/validator.rb +1 -1
  44. data/lib/xsd/version.rb +1 -1
  45. data/lib/xsd/xml.rb +107 -31
  46. data/lib/xsd.rb +1 -0
  47. data/xsd.gemspec +0 -8
  48. metadata +3 -100
@@ -7,12 +7,12 @@ module XSD
7
7
  class Documentation < BaseObject
8
8
  # Optional. A URI reference that specifies the source of the application information
9
9
  # @!attribute source
10
- # @return [String]
10
+ # @return String
11
11
  property :source, :string
12
12
 
13
13
  # Optional. Specifies the language used in the contents
14
14
  # @!attribute xml_lang
15
- # @return [String]
15
+ # @return String
16
16
  property :'xml:lang', :string
17
17
  end
18
18
  end
@@ -14,30 +14,30 @@ module XSD
14
14
 
15
15
  # Optional. Specifies the name of the attribute. Name and ref attributes cannot both be present
16
16
  # @!attribute name
17
- # @return [String]
17
+ # @return String
18
18
  property :name, :string
19
19
 
20
20
  # Optional. Specifies either the name of a built-in data type, or the name of a simpleType or complexType element
21
21
  # @!attribute type
22
- # @return [String, nil]
22
+ # @return String, nil
23
23
  property :type, :string
24
24
 
25
25
  # Optional. Specifies the name of an element that can be substituted with this element. This attribute cannot be
26
26
  # used if the parent element is not the schema element
27
27
  # @!attribute substitution_group
28
- # @return [String, nil]
28
+ # @return String, nil
29
29
  property :substitutionGroup, :string
30
30
 
31
31
  # Optional. Specifies a default value for the element (can only be used if the element's content is a simple type
32
32
  # or text only)
33
33
  # @!attribute default
34
- # @return [String, nil]
34
+ # @return String, nil
35
35
  property :default, :string
36
36
 
37
37
  # Optional. Specifies a fixed value for the element (can only be used if the element's content is a simple type
38
38
  # or text only)
39
39
  # @!attribute fixed
40
- # @return [String, nil]
40
+ # @return String, nil
41
41
  property :fixed, :string
42
42
 
43
43
  # Optional. Specifies the form for the element. "unqualified" indicates that this element is not required to be
@@ -45,21 +45,21 @@ module XSD
45
45
  # prefix. The default value is the value of the elementFormDefault attribute of the schema element. This attribute
46
46
  # cannot be used if the parent element is the schema element
47
47
  # @!attribute form
48
- # @return [String]
48
+ # @return String
49
49
  property :form, :string
50
50
 
51
51
  # Optional. Specifies whether an explicit null value can be assigned to the element. True enables an instance of
52
52
  # the element to have the null attribute set to true. The null attribute is defined as part of the XML Schema
53
53
  # namespace for instances. Default is false
54
54
  # @!attribute nillable
55
- # @return [Boolean]
55
+ # @return Boolean
56
56
  property :nillable, :boolean, default: false
57
57
 
58
58
  # Optional. Specifies whether the element can be used in an instance document. True indicates that the element
59
59
  # cannot appear in the instance document. Instead, another element whose substitutionGroup attribute contains the
60
60
  # qualified name (QName) of this element must appear in this element's place. Default is false
61
61
  # @!attribute abstract
62
- # @return [Boolean]
62
+ # @return Boolean
63
63
  property :abstract, :boolean, default: false
64
64
 
65
65
  # Optional. Prevents an element with a specified type of derivation from being used in place of this element.
@@ -69,7 +69,7 @@ module XSD
69
69
  # substitution - prevents elements derived by substitution
70
70
  # #all - prevents all derived elements
71
71
  # @!attribute block
72
- # @return [String, nil]
72
+ # @return String, nil
73
73
  property :block, :string
74
74
 
75
75
  # Optional. Sets the default value of the final attribute on the element element. This attribute cannot be used if
@@ -79,50 +79,50 @@ module XSD
79
79
  # restriction - prevents elements derived by restriction
80
80
  # #all - prevents all derived elements
81
81
  # @!attribute final
82
- # @return [String, nil]
82
+ # @return String, nil
83
83
  property :final, :string
84
84
 
85
85
  # Nested unique objects
86
86
  # @!attribute unique
87
- # @return [Array<Unique>]
87
+ # @return Array<Unique>
88
88
  child :unique, [:unique]
89
89
 
90
90
  # Determine if element is required
91
- # @return [Boolean]
91
+ # @return Boolean
92
92
  def required?
93
93
  computed_min_occurs > 0
94
94
  end
95
95
 
96
96
  # Determine if element is optional
97
- # @return [Boolean]
97
+ # @return Boolean
98
98
  def optional?
99
99
  !required?
100
100
  end
101
101
 
102
102
  # Determine if element may occur multiple times
103
- # @return [Boolean]
103
+ # @return Boolean
104
104
  def multiple_allowed?
105
105
  computed_max_occurs == :unbounded || computed_max_occurs > 1
106
106
  end
107
107
 
108
108
  # Determine if element has complex content
109
- # @return [Boolean]
109
+ # @return Boolean
110
110
  def complex?
111
- complex_type && !complex_type.simple_content && all_elements.any?
111
+ complex_type && !complex_type.simple_content && collect_elements.any?
112
112
  end
113
113
 
114
114
  # Get elements that can appear instead of this one
115
- # @return [Array<Element>]
115
+ # @return Array<Element>
116
116
  def substitution_elements
117
117
  # TODO: for now we do not search in parent schemas (that imported current schema)
118
118
  # TODO: refactor for better namespace handling (use xpath with namespaces or correct comparison)
119
- schema.all_elements.select do |element|
119
+ schema.collect_elements.select do |element|
120
120
  element.substitution_group&.split(':')&.last == name
121
121
  end
122
122
  end
123
123
 
124
124
  # Get target namespace
125
- # @return [String]
125
+ # @return String
126
126
  def target_namespace
127
127
  schema.target_namespace
128
128
  end
@@ -8,7 +8,26 @@ module XSD
8
8
  TYPE_PROPERTY = nil
9
9
 
10
10
  include Based
11
- include SimpleTyped
12
11
  include AttributeContainer
12
+
13
+ # Nested group
14
+ # @!attribute group
15
+ # @return Group
16
+ child :group, :group
17
+
18
+ # Nested all
19
+ # @!attribute all
20
+ # @return All
21
+ child :all, :all
22
+
23
+ # Nested choice
24
+ # @!attribute choice
25
+ # @return Choice
26
+ child :choice, :choice
27
+
28
+ # Nested sequence
29
+ # @!attribute sequence
30
+ # @return Sequence
31
+ child :sequence, :sequence
13
32
  end
14
33
  end
@@ -6,7 +6,7 @@ module XSD
6
6
  class Facet < BaseObject
7
7
  # Returns facet value
8
8
  # @!attribute value
9
- # @return [String]
9
+ # @return String
10
10
  property :value, :string
11
11
  end
12
12
  end
@@ -7,7 +7,7 @@ module XSD
7
7
  class Field < BaseObject
8
8
  # Required. Identifies a single element or attribute whose content or value is used for the constraint
9
9
  # @!attribute xpath
10
- # @return [String]
10
+ # @return String
11
11
  property :xpath, :string, required: true
12
12
  end
13
13
  end
@@ -11,22 +11,22 @@ module XSD
11
11
 
12
12
  # Optional. Specifies the name of the attribute. Name and ref attributes cannot both be present
13
13
  # @!attribute name
14
- # @return [String]
14
+ # @return String
15
15
  property :name, :string
16
16
 
17
17
  # Nested all object
18
18
  # @!attribute all
19
- # @return [All]
19
+ # @return All
20
20
  child :all, :all
21
21
 
22
22
  # Nested choice object
23
23
  # @!attribute choice
24
- # @return [Choice]
24
+ # @return Choice
25
25
  child :choice, :choice
26
26
 
27
27
  # Nested sequence object
28
28
  # @!attribute sequence
29
- # @return [Sequence]
29
+ # @return Sequence
30
30
  child :sequence, :sequence
31
31
  end
32
32
  end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rest-client'
4
-
5
3
  module XSD
6
4
  # The import element is used to add multiple schemas with different target namespace to a document.
7
5
  # Parent elements: schema
@@ -9,59 +7,32 @@ module XSD
9
7
  class Import < BaseObject
10
8
  # Optional. Specifies the URI of the namespace to import
11
9
  # @!attribute namespace
12
- # @return [String, nil]
10
+ # @return String, nil
13
11
  property :namespace, :string
14
12
 
15
13
  # Optional. Specifies the URI to the schema for the imported namespace
16
14
  # @!attribute schema_location
17
- # @return [String, nil]
15
+ # @return String, nil
18
16
  property :schemaLocation, :string
19
17
 
20
- # Get imported reader
21
- # @return [XSD:XML]
22
- def imported_reader
23
- return @imported_reader if @imported_reader
24
-
25
- xml = if reader.imported_xsd[namespace]
26
- # check in imported xsd by namespace
27
- reader.imported_xsd[namespace]
28
- elsif schema_location =~ /^https?:/
29
- # check http(s) schema location
30
- download_uri(schema_location)
31
- elsif (path = local_path)
32
- # check local relative path
33
- path
34
- elsif namespace =~ /^https?:/
35
- # check http(s) namespace
36
- # TODO: investigate spec conformance
37
- download_uri(namespace.gsub(/#{File.basename(schema_location, '.*')}$/, '').to_s + schema_location)
38
- else
39
- raise ImportError, "Failed to locate import '#{schema_location}' for namespace '#{namespace}'"
40
- end
41
-
42
- # TODO: pass all provided options
43
- @imported_reader = XSD::XML.new(xml, imported_xsd: reader.imported_xsd, logger: reader.logger)
44
- end
45
-
46
- def local_path
47
- return unless reader.xsd.is_a?(Pathname)
48
-
49
- path = reader.xsd.dirname.join(schema_location)
50
- path.file? ? path : nil
51
- end
18
+ # Get imported schema
19
+ # @return Schema
20
+ def imported_schema
21
+ known_schemas = reader.schemas_for_namespace(namespace)
22
+ return known_schemas.first if known_schemas.any?
52
23
 
53
- private
24
+ unless schema_location
25
+ raise ImportError, "Schema location not provided for namespace '#{namespace}', use add_schema_xml()/add_schema_node()"
26
+ end
54
27
 
55
- def download_uri(uri)
56
- reader.logger.debug(XSD) { "Downloading import schema for namespace '#{namespace}' from '#{uri}'" }
28
+ xml = reader.resource_resolver.call(schema_location, namespace)
29
+ new_schema = reader.add_schema_xml(xml)
57
30
 
58
- begin
59
- response = RestClient.get(uri)
60
- rescue RestClient::Exception => e
61
- raise ImportError, e.message
31
+ unless namespace == new_schema.target_namespace
32
+ raise ImportError, 'Import namespace does not match imported schema targetNamespace'
62
33
  end
63
34
 
64
- response.body
35
+ new_schema
65
36
  end
66
37
  end
67
38
  end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module XSD
4
+ # The include element is used to add multiple schemas with the same target namespace to a document.
5
+ # Parent elements: schema
6
+ # https://www.w3schools.com/xml/el_include.asp
7
+ class Include < BaseObject
8
+ # Required. Specifies the URI to the schema to include in the target namespace of the containing schema
9
+ # @!attribute schema_location
10
+ # @return String
11
+ property :schemaLocation, :string
12
+
13
+ # Get imported schema
14
+ # @return Schema
15
+ def imported_schema
16
+ # cache included schema locally as it has no unique namespace to check in global registry
17
+ return @imported_schema if @imported_schema
18
+
19
+ xml = reader.resource_resolver.call(schema_location)
20
+ new_schema = reader.add_schema_xml(xml)
21
+
22
+ unless schema.target_namespace == new_schema.target_namespace
23
+ raise ImportError, 'Schema targetNamespace does not match included schema targetNamespace'
24
+ end
25
+
26
+ @imported_schema = new_schema
27
+ end
28
+ end
29
+ end
@@ -9,17 +9,17 @@ module XSD
9
9
  # The name must be a no-colon-name (NCName) as defined in the XML Namespaces specification.
10
10
  # The name must be unique within an identity constraint set. Required.
11
11
  # @!attribute name
12
- # @return [String]
12
+ # @return String
13
13
  property :name, :string, required: true
14
14
 
15
15
  # Get nested selector object
16
16
  # @!attribute selector
17
- # @return [Selector]
17
+ # @return Selector
18
18
  child :selector, :selector
19
19
 
20
20
  # Get nested field objects
21
21
  # @!attribute fields
22
- # @return [Array<Field>]
22
+ # @return Array<Field>
23
23
  child :fields, [:field]
24
24
  end
25
25
  end
@@ -9,7 +9,7 @@ module XSD
9
9
  # The name must be a no-colon-name (NCName) as defined in the XML Namespaces specification.
10
10
  # The name must be unique within an identity constraint set. Required.
11
11
  # @!attribute name
12
- # @return [String]
12
+ # @return String
13
13
  property :name, :string, required: true
14
14
 
15
15
  # The name of a key or unique element defined in this schema
@@ -17,17 +17,17 @@ module XSD
17
17
  # The refer value must be a qualified name (QName).
18
18
  # The type can include a namespace prefix. Required.
19
19
  # @!attribute refer
20
- # @return [String]
20
+ # @return String
21
21
  property :refer, :string, required: true
22
22
 
23
23
  # Get nested selector object
24
24
  # @!attribute selector
25
- # @return [Selector]
25
+ # @return Selector
26
26
  child :selector, :selector
27
27
 
28
28
  # Get nested field objects
29
29
  # @!attribute fields
30
- # @return [Array<Field>]
30
+ # @return Array<Field>
31
31
  child :fields, [:field]
32
32
  end
33
33
  end
@@ -12,7 +12,7 @@ module XSD
12
12
  # Specifies the name of a built-in data type or simpleType element defined in this or another schema.
13
13
  # This attribute is not allowed if the content contains a simpleType element, otherwise it is required
14
14
  # @!attribute item_type
15
- # @return [String, nil]
15
+ # @return String, nil
16
16
  property :itemType, :string
17
17
  end
18
18
  end
@@ -16,8 +16,28 @@ module XSD
16
16
  fractionDigits length minLength maxLength enumeration whiteSpace pattern
17
17
  ].freeze
18
18
 
19
+ # Nested group
20
+ # @!attribute group
21
+ # @return Group
22
+ child :group, :group
23
+
24
+ # Nested all
25
+ # @!attribute all
26
+ # @return All
27
+ child :all, :all
28
+
29
+ # Nested choice
30
+ # @!attribute choice
31
+ # @return Choice
32
+ child :choice, :choice
33
+
34
+ # Nested sequence
35
+ # @!attribute sequence
36
+ # @return Sequence
37
+ child :sequence, :sequence
38
+
19
39
  # Get restriction facets
20
- # @return [Hash]
40
+ # @return Hash
21
41
  def facets
22
42
  nodes.inject({}) do |hash, node|
23
43
  if FACET_ELEMENTS.include?(node.name)
@@ -40,8 +60,8 @@ module XSD
40
60
 
41
61
  # Get all available elements on the current stack level, optionally including base type elements
42
62
  # @param [Boolean] include_base
43
- # @return [Array<Element>]
44
- def all_elements(include_base = false)
63
+ # @return Array<Element>
64
+ def collect_elements(include_base = false)
45
65
  # By default we do not include base element for complex restrictions
46
66
  super
47
67
  end
@@ -13,7 +13,7 @@ module XSD
13
13
  # are not required to be qualified with the namespace prefix. "qualified" indicates that attributes from the target
14
14
  # namespace must be qualified with the namespace prefix
15
15
  # @!attribute attribute_form_default
16
- # @return [String]
16
+ # @return String
17
17
  property :attributeFormDefault, :string, default: 'unqualified'
18
18
 
19
19
  # Optional. The form for elements declared in the target namespace of this schema. The value must be "qualified"
@@ -21,7 +21,7 @@ module XSD
21
21
  # not required to be qualified with the namespace prefix. "qualified" indicates that elements from the target
22
22
  # namespace must be qualified with the namespace prefix
23
23
  # @!attribute element_form_default
24
- # @return [String]
24
+ # @return String
25
25
  property :elementFormDefault, :string, default: 'unqualified'
26
26
 
27
27
  # Optional. Specifies the default value of the block attribute on element and complexType elements in the target
@@ -33,7 +33,7 @@ module XSD
33
33
  # substitution - prevents substitution of elements
34
34
  # #all - prevents all derived complex types
35
35
  # @!attribute block_default
36
- # @return [String]
36
+ # @return String
37
37
  property :blockDefault, :string
38
38
 
39
39
  # Optional. Specifies the default value of the final attribute on element, simpleType, and complexType elements in
@@ -46,109 +46,115 @@ module XSD
46
46
  # union - prevents derivation by union
47
47
  # #all - prevents all derivation
48
48
  # @!attribute final_default
49
- # @return [String]
49
+ # @return String
50
50
  property :finalDefault, :string
51
51
 
52
52
  # Optional. A URI reference of the namespace of this schema
53
53
  # @!attribute target_namespace
54
- # @return [String]
54
+ # @return String
55
55
  property :targetNamespace, :string
56
56
 
57
57
  # Optional. Specifies the version of the schema
58
58
  # @!attribute version
59
- # @return [String]
59
+ # @return String
60
60
  property :version, :string
61
61
 
62
62
  # A URI reference that specifies one or more namespaces for use in this schema. If no prefix is assigned, the schema
63
63
  # components of the namespace can be used with unqualified references
64
64
  # @!attribute xmlns
65
- # @return [String]
65
+ # @return String
66
66
  property :xmlns, :string
67
67
 
68
68
  # Global complex types
69
69
  # @!attribute complex_types
70
- # @return [Array<ComplexType>]
70
+ # @return Array<ComplexType>
71
71
  child :complex_types, [:complexType]
72
72
 
73
73
  # Global simple types
74
74
  # @!attribute simple_types
75
- # @return [Array<SimpleType>]
75
+ # @return Array<SimpleType>
76
76
  child :simple_types, [:simpleType]
77
77
 
78
78
  # Global groups
79
79
  # @!attribute groups
80
- # @return [Array<Group>]
80
+ # @return Array<Group>
81
81
  child :groups, [:group]
82
82
 
83
- # Get nested groups
83
+ # Schema imports
84
84
  # @!attribute imports
85
- # @return [Array<Import>]
85
+ # @return Array<Import>
86
86
  child :imports, [:import]
87
87
 
88
+ # Schema includes
89
+ # @!attribute includes
90
+ # @return Array<Include>
91
+ child :includes, [:include]
92
+
88
93
  # Get current schema object
89
- # @return [Schema]
94
+ # @return Schema
90
95
  def schema
91
96
  self
92
97
  end
93
98
 
94
- # Get all available root elements. Overrides base implementation for better speed
95
- # @return [Array<Element>]
96
- def all_elements(*)
99
+ # Get all available elements on the current stack level, for schema same as elements
100
+ # @return Array<Element>
101
+ def collect_elements(*)
97
102
  elements
98
103
  end
99
104
 
100
- # Get all available root attributes. Overrides base implementation for better speed
101
- # @return [Array<Attribute>]
102
- def all_attributes(*)
105
+ # Get all available attributes on the current stack level, for schema same as attributes
106
+ # @return Array<Attribute>
107
+ def collect_attributes(*)
103
108
  attributes
104
109
  end
105
110
 
106
111
  # Get target namespace prefix. There may be more than one prefix, but we return only first defined
107
- # @return [String]
112
+ # @return String
108
113
  def target_namespace_prefix
109
114
  @target_namespace_prefix ||= namespaces.key(target_namespace)&.sub(/^xmlns:?/, '') || ''
110
115
  end
111
116
 
112
117
  # Get schema namespace prefix
113
- # @return [String]
118
+ # @return String
114
119
  def namespace_prefix
115
120
  @namespace_prefix ||= namespaces.key(XML_SCHEMA).sub(/^xmlns:?/, '')
116
121
  end
117
122
 
118
123
  # Check if namespace is a target namespace
119
- # @param [String] prefix
120
- # @return [Boolean]
121
- def targets_namespace?(prefix)
122
- namespaces[prefix.empty? ? 'xmlns' : "xmlns:#{prefix}"] == target_namespace
124
+ # @param [String, nil] namespace
125
+ # @return Boolean
126
+ def targets_namespace?(namespace)
127
+ namespace == target_namespace || namespaces[namespace.empty? ? 'xmlns' : "xmlns:#{namespace}"] == target_namespace
123
128
  end
124
129
 
125
- # Override map_children on schema to get objects from all imported schemas
130
+ # Override map_children on schema to get objects from all loaded schemas
126
131
  # @param [Symbol] name
127
- # @return [Array<BaseObject>]
132
+ # @return Array<BaseObject>
128
133
  def map_children(name, cache = {})
129
134
  super(name) + import_map_children(name, cache)
130
135
  end
131
136
 
132
- # Get children from all imported schemas
137
+ # Get children from all loaded schemas
133
138
  # @param [Symbol] name
134
- # @return [Array<BaseObject>]
135
- # TODO: better recursion handling, may be refactor needed 1 reader for all schemas with centralized cache
139
+ # @return Array<BaseObject>
136
140
  def import_map_children(name, cache)
137
- return [] if name.to_sym == :import
141
+ return [] if %i[import include].include?(name.to_sym)
138
142
 
139
- imports.map do |import|
140
- if cache[import.namespace]
141
- reader.logger.debug(XSD) { "Schema '#{import.namespace}' already parsed, skiping" }
143
+ (includes + imports).map do |import|
144
+ key = import.respond_to?(:namespace) && import.namespace ? import.namespace : import.schema_location
145
+ if cache.key?(key)
142
146
  nil
143
147
  else
144
- cache[import.namespace] = true
145
- import.imported_reader.schema.map_children(name, cache)
148
+ cache[key] = true
149
+ import.imported_schema.map_children(name, cache)
146
150
  end
147
151
  end.compact.flatten
148
152
  end
149
153
 
154
+ # Get import by namespace
155
+ # @return Import
150
156
  def import_by_namespace(ns)
151
- aliases = [ns, namespaces["xmlns:#{(ns || '').gsub(/^xmlns:/, '')}"]].compact
157
+ aliases = [ns, namespaces["xmlns:#{(ns || '').gsub(/^xmlns:/, '')}"], reader.namespace_prefixes[ns]].compact
152
158
  imports.find { |import| aliases.include?(import.namespace) }
153
159
  end
154
160
  end
@@ -9,7 +9,7 @@ module XSD
9
9
  # Required. Specifies an XPath expression, relative to the element being declared, that identifies the child
10
10
  # elements to which the identity constraint applies
11
11
  # @!attribute xpath
12
- # @return [String]
12
+ # @return String
13
13
  property :xpath, :string, required: true
14
14
  end
15
15
  end
@@ -12,22 +12,22 @@ module XSD
12
12
 
13
13
  # Nested groups
14
14
  # @!attribute groups
15
- # @return [Array<Group>]
15
+ # @return Array<Group>
16
16
  child :groups, [:group]
17
17
 
18
18
  # Nested choices
19
19
  # @!attribute choices
20
- # @return [Array<Choice>]
20
+ # @return Array<Choice>
21
21
  child :choices, [:choice]
22
22
 
23
23
  # Nested sequences
24
24
  # @!attribute sequences
25
- # @return [Array<Sequence>]
25
+ # @return Array<Sequence>
26
26
  child :sequences, [:sequence]
27
27
 
28
28
  # Nested anys
29
29
  # @!attribute anys
30
- # @return [Array<Any>]
30
+ # @return Array<Any>
31
31
  child :anys, [:any]
32
32
  end
33
33
  end
@@ -8,12 +8,12 @@ module XSD
8
8
  class SimpleContent < BaseObject
9
9
  # Nested extension
10
10
  # @!attribute extension
11
- # @return [Extension, nil]
11
+ # @return Extension, nil
12
12
  child :extension, :extension
13
13
 
14
14
  # Nested restriction
15
15
  # @!attribute restriction
16
- # @return [Restriction, nil]
16
+ # @return Restriction, nil
17
17
  child :restriction, :restriction
18
18
  end
19
19
  end