datacite-mapping 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +5 -5
  2. data/.rubocop.yml +4 -0
  3. data/CHANGES.md +15 -0
  4. data/README.md +8 -3
  5. data/datacite-mapping.gemspec +2 -3
  6. data/lib/datacite/mapping.rb +1 -1
  7. data/lib/datacite/mapping/affiliation.rb +44 -0
  8. data/lib/datacite/mapping/alternate_identifier.rb +2 -0
  9. data/lib/datacite/mapping/contributor.rb +32 -6
  10. data/lib/datacite/mapping/contributor_name.rb +42 -0
  11. data/lib/datacite/mapping/creator.rb +39 -7
  12. data/lib/datacite/mapping/creator_name.rb +42 -0
  13. data/lib/datacite/mapping/date.rb +12 -0
  14. data/lib/datacite/mapping/date_value.rb +6 -0
  15. data/lib/datacite/mapping/description.rb +6 -2
  16. data/lib/datacite/mapping/empty_filtering_nodes.rb +1 -0
  17. data/lib/datacite/mapping/funding_reference.rb +14 -1
  18. data/lib/datacite/mapping/geo_location.rb +6 -1
  19. data/lib/datacite/mapping/geo_location_box.rb +5 -0
  20. data/lib/datacite/mapping/geo_location_node.rb +4 -2
  21. data/lib/datacite/mapping/geo_location_point.rb +3 -0
  22. data/lib/datacite/mapping/geo_location_polygon.rb +10 -1
  23. data/lib/datacite/mapping/identifier.rb +11 -9
  24. data/lib/datacite/mapping/module_info.rb +2 -2
  25. data/lib/datacite/mapping/name_identifier.rb +10 -6
  26. data/lib/datacite/mapping/name_type.rb +18 -0
  27. data/lib/datacite/mapping/publisher.rb +42 -0
  28. data/lib/datacite/mapping/read_only_nodes.rb +4 -0
  29. data/lib/datacite/mapping/related_identifier.rb +38 -1
  30. data/lib/datacite/mapping/resource.rb +25 -11
  31. data/lib/datacite/mapping/resource_type.rb +4 -0
  32. data/lib/datacite/mapping/rights.rb +33 -6
  33. data/lib/datacite/mapping/subject.rb +3 -2
  34. data/lib/datacite/mapping/title.rb +3 -2
  35. data/spec/data/datacite4/{datacite-example-Box_dateCollected_DataCollector-v4.0.xml → datacite-example-Box_dateCollected_DataCollector-v4.xml} +9 -11
  36. data/spec/data/datacite4/{datacite-example-GeoLocation-v4.0.xml → datacite-example-GeoLocation-v4.xml} +11 -10
  37. data/spec/data/datacite4/{datacite-example-HasMetadata-v4.0.xml → datacite-example-HasMetadata-v4.xml} +18 -13
  38. data/spec/data/datacite4/{datacite-example-ResearchGroup_Methods-v4.0.xml → datacite-example-ResearchGroup_Methods-v4.xml} +14 -12
  39. data/spec/data/datacite4/{datacite-example-ResourceTypeGeneral_Collection-v4.0.xml → datacite-example-ResourceTypeGeneral_Collection-v4.xml} +9 -9
  40. data/spec/data/datacite4/datacite-example-affiliation-v4.xml +114 -0
  41. data/spec/data/datacite4/{datacite-example-complicated-v4.0.xml → datacite-example-complicated-v4.xml} +14 -11
  42. data/spec/data/datacite4/datacite-example-datapaper-v4.xml +32 -0
  43. data/spec/data/datacite4/{datacite-example-dataset-v4.0.xml → datacite-example-dataset-v4.xml} +20 -14
  44. data/spec/data/datacite4/datacite-example-full-v4.xml +114 -0
  45. data/spec/data/datacite4/{datacite-example-fundingReference-v.4.0.xml → datacite-example-fundingReference-v4.xml} +16 -13
  46. data/spec/data/datacite4/datacite-example-polygon-advanced-v4.xml +141 -0
  47. data/spec/data/datacite4/datacite-example-polygon-v4.xml +161 -0
  48. data/spec/data/datacite4/{datacite-example-relationTypeIsIdenticalTo-v4.0.xml → datacite-example-relationTypeIsIdenticalTo-v4.xml} +17 -17
  49. data/spec/data/datacite4/datacite-example-software-v4.xml +66 -0
  50. data/spec/data/datacite4/{datacite-example-video-v4.0.xml → datacite-example-video-v4.xml} +7 -7
  51. data/spec/data/datacite4/{datacite-example-workflow-v4.0.xml → datacite-example-workflow-v4.xml} +13 -11
  52. data/spec/data/datacite4/metadata.xsd +102 -57
  53. data/spec/rspec_custom_matchers.rb +3 -0
  54. data/spec/unit/datacite/mapping/contributor_spec.rb +7 -1
  55. data/spec/unit/datacite/mapping/creator_spec.rb +9 -3
  56. data/spec/unit/datacite/mapping/resource_spec.rb +14 -17
  57. data/spec/unit/datacite/mapping/rights_spec.rb +0 -13
  58. metadata +42 -28
  59. data/spec/data/datacite4/datacite-example-full-v4.0.xml +0 -71
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: c6c6c78e95b15168e1d50cca76a43313c568e96f
4
- data.tar.gz: '08f1de9f06449584c9b4bab11139cd0e79882bf0'
2
+ SHA256:
3
+ metadata.gz: 735d8cc7ab80f9534cba40b1b46b38b15dc8124f4e0cd53bb1963c5b31b2a9c2
4
+ data.tar.gz: f052e557983ea3af4ea3c025db12daa93ad5e60253f3e427c0cfe1ee39277bf1
5
5
  SHA512:
6
- metadata.gz: 4d2b532ba6cb94d49403bebcef4afb565c7baee59c6ae43725b74fdbd9f6a40dd08ac88e68c2e907db47bab444352dc7c7d52046a2944341ca3df386cf088def
7
- data.tar.gz: c69fc51f41731b7fd77692cf70714e8072ebfc0d3f847a24ee345428a2c382a3f2f901c5483c1d0ac26f2b0108c8081f9f4814ee92fe935556f7c84a8019e211
6
+ metadata.gz: 21645ef65182b9800dd3657188d31dc38a2ce148a910853d667eacaebf20dd334bdcd2ee34c32b85dd5bfa8b681b47a9380b0ab600367af5750a39c80c4ddf35
7
+ data.tar.gz: 33c2ff60458e0c835c086b2eff99e5198b26e0783ef483444418cd74e98f715ff4f149534e979fa5f124044924f5ad781088021ca56ad867a0af5ae89fe8c286
@@ -2,6 +2,10 @@
2
2
  Metrics/LineLength:
3
3
  Enabled: False
4
4
 
5
+ # Disable parameter-length check; this is determined by the number of XML attributes defined in the DataCite schema
6
+ Metrics/ParameterLists:
7
+ Enabled: False
8
+
5
9
  # Disable problematic module documentation check (see https://github.com/bbatsov/rubocop/issues/947)
6
10
  Style/Documentation:
7
11
  Enabled: false
data/CHANGES.md CHANGED
@@ -1,3 +1,18 @@
1
+ ## 0.4.0 (12 November 2019
2
+
3
+ - Datacite 4.3 support:
4
+ - Added the new elements and attributes introduced in DataCite 4.1, 4.2, and 4.3.
5
+ - Updated sample DataCite XML documents to include the new examples introduced in DataCite 4.3.
6
+ - Reading from XML still supports any version of the DataCite schema from 3.0 through 4.3.
7
+ - Object mapping for some items was updated to use full objects instead of simple Strings
8
+ when the DataCite schema introduced more complicated structure. E.g., because ContributorName
9
+ can now include a nameType and an xml:lang, the simple "name" String in the Contributor object was
10
+ replaced with a ContributorName object, accessed through Contributor.contributor_name, while
11
+ Contributor.name is now a convenience method that allows access to the value as a String.
12
+ - These updates to the gem are fully backwards compatible with respect to the input/output XML, but some changes in the object
13
+ model were required to support the more complex XML. So ruby code that worked with version 0.3.0 will require minor updates to use
14
+ this version.
15
+
1
16
  ## 0.3.0 (2 January 2018)
2
17
 
3
18
  - Update to Ruby 2.4.1
data/README.md CHANGED
@@ -10,9 +10,14 @@ based on [xml-mapping](http://multi-io.github.io/xml-mapping/) and
10
10
  [xml-mapping_extensions](https://github.com/dmolesUC3/xml-mapping_extensions).
11
11
  Full API documentation on [RubyDoc.info](http://www.rubydoc.info/github/CDLUC3/datacite-mapping/master/frames).
12
12
 
13
- Supports [Datacite 4.0](https://schema.labs.datacite.org/meta/kernel-4.0/); backward-compatible with
13
+ Supports [Datacite 4.3](https://schema.labs.datacite.org/meta/kernel-4.3/); backward-compatible with
14
14
  [Datacite 3.1](https://schema.labs.datacite.org/meta/kernel-3/).
15
15
 
16
+ Note that although this gem maintains compatibility with multiple
17
+ versions of DataCite XML, changes to DataCite XML sometimes force
18
+ changes to the internal object model of the gem. So different versions
19
+ of this gem may require minor updates to how a part of the model is accessed.
20
+
16
21
  ## Usage
17
22
 
18
23
  The core of the Datacite::Mapping library is the `Resource` class, corresponding to the root `<resource/>` element
@@ -37,13 +42,13 @@ Example:
37
42
  require 'datacite/mapping'
38
43
  include Datacite::Mapping
39
44
 
40
- resource = Resource.load_from_file('datacite-example-full-v4.0.xml')
45
+ resource = Resource.load_from_file('datacite-example-full-v4.3.xml')
41
46
  # => #<Datacite::Mapping::Resource:0x007f97689e87a0 …
42
47
 
43
48
  abstract = resource.descriptions.find { |d| d.type = DescriptionType::ABSTRACT }
44
49
  # => #<Datacite::Mapping::Description:0x007f976aafa330 …
45
50
  abstract.value
46
- # => "XML example of all DataCite Metadata Schema v4.0 properties."
51
+ # => "XML example of all DataCite Metadata Schema v4.3 properties."
47
52
  ```
48
53
 
49
54
  Note that Datacite::Mapping uses the [TypesafeEnum](https://github.com/dmolesUC3/typesafe_enum) gem to represent controlled
@@ -1,13 +1,12 @@
1
-
2
1
  # frozen_string_literal: true
3
2
 
4
- lib = File.expand_path('../lib', __FILE__)
3
+ lib = File.expand_path('lib', __dir__)
5
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
6
5
 
7
6
  require 'uri'
8
7
  require 'datacite/mapping/module_info'
9
8
 
10
- Gem::Specification.new do |spec| # rubocop:disable Metrics/BlockLength
9
+ Gem::Specification.new do |spec|
11
10
  spec.name = Datacite::Mapping::NAME
12
11
  spec.version = Datacite::Mapping::VERSION
13
12
  spec.authors = ['David Moles']
@@ -19,7 +19,7 @@ module Datacite
19
19
  schema_location: 'http://schema.datacite.org/meta/kernel-4/metadata.xsd'
20
20
  )
21
21
 
22
- Dir.glob(File.expand_path('../mapping/*.rb', __FILE__)).sort.each(&method(:require))
22
+ Dir.glob(File.expand_path('mapping/*.rb', __dir__)).sort.each(&method(:require))
23
23
 
24
24
  end
25
25
  end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'xml/mapping'
4
+ require 'datacite/mapping/read_only_nodes'
5
+
6
+ module Datacite
7
+ module Mapping
8
+ class Affiliation
9
+ include XML::Mapping
10
+
11
+ def initialize(identifier: nil, identifier_scheme: nil, scheme_uri: nil, value:)
12
+ self.identifier = identifier
13
+ self.identifier_scheme = identifier_scheme
14
+ self.scheme_uri = scheme_uri
15
+ self.value = value
16
+ end
17
+
18
+ def value=(value)
19
+ new_value = value&.strip
20
+ raise ArgumentError, 'Value cannot be empty or nil' unless new_value && !new_value.empty?
21
+
22
+ @value = new_value.strip
23
+ end
24
+
25
+ # @!attribute [rw] identifier
26
+ # @return [String, nil] The affiliation identifier. Optional.
27
+ text_node :identifier, '@affiliationIdentifier', default_value: nil
28
+
29
+ # @!attribute [rw] identifier_scheme
30
+ # @return [String, nil] The scheme for the affiliation identifier. Optional.
31
+ text_node :identifier_scheme, '@affiliationIdentifierScheme', default_value: nil
32
+
33
+ # @!attribute [rw] scheme_uri
34
+ # @return [URI, nil] the URI of the identifier scheme. Optional.
35
+ uri_node :scheme_uri, '@schemeURI', default_value: nil
36
+
37
+ # @!attribute [rw] value
38
+ # @return [String] the name itself.
39
+ text_node :value, 'text()'
40
+
41
+ fallback_mapping :datacite_3, :_default
42
+ end
43
+ end
44
+ end
@@ -22,6 +22,7 @@ module Datacite
22
22
  # @param val [String] the identifier type
23
23
  def type=(val)
24
24
  raise ArgumentError, 'No identifier type provided' unless val
25
+
25
26
  @type = val
26
27
  end
27
28
 
@@ -29,6 +30,7 @@ module Datacite
29
30
  # @param val [String] the value
30
31
  def value=(val)
31
32
  raise ArgumentError, 'No identifier value provided' unless val
33
+
32
34
  @value = val
33
35
  end
34
36
 
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'xml/mapping_extensions'
4
4
  require 'datacite/mapping/name_identifier'
5
+ require 'datacite/mapping/contributor_name'
5
6
 
6
7
  module Datacite
7
8
  module Mapping
@@ -93,20 +94,45 @@ module Datacite
93
94
  self.type = type
94
95
  end
95
96
 
97
+ # name can be entered as a string or a ContributorName object, but it will be stored
98
+ # internally as a ContributorName object
96
99
  def name=(value)
97
- new_value = value&.strip
98
- raise ArgumentError, 'Name cannot be empty or nil' unless new_value && !new_value.empty?
99
- @name = new_value
100
+ raise ArgumentError, 'Name cannot be empty or nil' unless value
101
+
102
+ @contributor_name = if value.is_a?(ContributorName)
103
+ value
104
+ else
105
+ ContributorName.new(value: value)
106
+ end
107
+ end
108
+
109
+ def contributor_name=(value)
110
+ raise ArgumentError, 'ContributorName cannot be empty or nil' unless value
111
+
112
+ @contributor_name = value
113
+ end
114
+
115
+ def name
116
+ @contributor_name&.value
100
117
  end
101
118
 
102
119
  def type=(value)
103
120
  raise ArgumentError, 'Type cannot be nil' unless value
121
+
104
122
  @type = value
105
123
  end
106
124
 
107
125
  # @!attribute [rw] name
108
- # @return [String] the personal name of the contributor, in the format `Family, Given`. Cannot be empty or nil
109
- text_node :name, 'contributorName'
126
+ # @return [String] The personal name of the creator, in the format `Family, Given`. Cannot be empty or nil.
127
+ object_node :contributor_name, 'contributorName', class: ContributorName
128
+
129
+ # @!attribute [rw] given_name
130
+ # @return [String, nil] The given name of the creator. Optional.
131
+ text_node :given_name, 'givenName', default_value: nil
132
+
133
+ # @!attribute [rw] family_name
134
+ # @return [String, nil] The family name of the creator. Optional.
135
+ text_node :family_name, 'familyName', default_value: nil
110
136
 
111
137
  # @!attribute [rw] identifier
112
138
  # @return [NameIdentifier, nil] an identifier for the contributor. Optional.
@@ -114,7 +140,7 @@ module Datacite
114
140
 
115
141
  # @!attribute [rw] affiliations
116
142
  # @return [Array<String>] the contributor's affiliations. Defaults to an empty list.
117
- array_node :affiliations, 'affiliation', class: String, default_value: []
143
+ array_node :affiliations, 'affiliation', class: Affiliation, default_value: []
118
144
 
119
145
  # @!attribute [rw] type
120
146
  # @return [ContributorType] the contributor type. Cannot be nil.
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'xml/mapping'
4
+ require 'datacite/mapping/read_only_nodes'
5
+ require 'datacite/mapping/name_identifier'
6
+ require 'datacite/mapping/name_type'
7
+
8
+ module Datacite
9
+ module Mapping
10
+ class ContributorName
11
+ include XML::Mapping
12
+ def initialize(type: nil, language: nil, value:)
13
+ self.type = type
14
+ self.language = language
15
+ self.value = value
16
+ end
17
+
18
+ def language=(value)
19
+ @language = value&.strip
20
+ end
21
+
22
+ def value=(value)
23
+ new_value = value&.strip
24
+ raise ArgumentError, 'Value cannot be empty or nil' unless new_value && !new_value.empty?
25
+
26
+ @value = new_value.strip
27
+ end
28
+
29
+ # @!attribute [rw] type
30
+ # @return [NameType, nil] the name type. Optional.
31
+ typesafe_enum_node :type, '@nameType', class: NameType, default_value: nil
32
+
33
+ # @!attribute [rw] language
34
+ # @return [String, nil] an IETF BCP 47, ISO 639-1 language code identifying the language.
35
+ text_node :language, '@xml:lang', default_value: nil
36
+
37
+ # @!attribute [rw] value
38
+ # @return [String] the name itself.
39
+ text_node :value, 'text()'
40
+ end
41
+ end
42
+ end
@@ -3,9 +3,12 @@
3
3
  require 'xml/mapping'
4
4
  require 'datacite/mapping/read_only_nodes'
5
5
  require 'datacite/mapping/name_identifier'
6
+ require 'datacite/mapping/creator_name'
7
+ require 'datacite/mapping/affiliation'
6
8
 
7
9
  module Datacite
8
10
  module Mapping
11
+
9
12
  # The main researchers involved working on the data, or the authors of the publication in priority order.
10
13
  class Creator
11
14
  include XML::Mapping
@@ -15,7 +18,7 @@ module Datacite
15
18
  # @param given_name [String, nil] The given name of the creator. Optional.
16
19
  # @param given_name [String, nil] The family name of the creator. Optional.
17
20
  # @param identifier [NameIdentifier, nil] An identifier for the creator. Optional.
18
- # @param affiliations [Array<String>, nil] The creator's affiliations. Defaults to an empty list.
21
+ # @param affiliations [Array<Affiliation>, nil] The creator's affiliations. Defaults to an empty list.
19
22
  def initialize(name:, given_name: nil, family_name: nil, identifier: nil, affiliations: [])
20
23
  self.name = name
21
24
  self.given_name = given_name
@@ -24,10 +27,26 @@ module Datacite
24
27
  self.affiliations = affiliations
25
28
  end
26
29
 
30
+ # name can be entered as a string or a CreatorName object, but it will be stored
31
+ # internally as a CreatorName object
27
32
  def name=(value)
28
- new_value = value&.strip
29
- raise ArgumentError, 'Name cannot be empty or nil' unless new_value && !new_value.empty?
30
- @name = new_value
33
+ raise ArgumentError, 'Name cannot be empty or nil' unless value
34
+
35
+ @creator_name = if value.is_a?(CreatorName)
36
+ value
37
+ else
38
+ CreatorName.new(value: value)
39
+ end
40
+ end
41
+
42
+ def creator_name=(value)
43
+ raise ArgumentError, 'CreatorName cannot be empty or nil' unless value
44
+
45
+ @creator_name = value
46
+ end
47
+
48
+ def name
49
+ @creator_name&.value
31
50
  end
32
51
 
33
52
  def given_name=(value)
@@ -40,13 +59,26 @@ module Datacite
40
59
  @family_name = new_value
41
60
  end
42
61
 
62
+ # Affiliations can be entered as an array of Strings or an array of Affiliation objects,
63
+ # but will be stored internally as an array of Affiliation objects
43
64
  def affiliations=(value)
44
- @affiliations = value || []
65
+ @affiliations = []
66
+ value&.each do |affil|
67
+ @affiliations << if affil.is_a?(Affiliation)
68
+ affil
69
+ else
70
+ Affiliation.new(value: affil)
71
+ end
72
+ end
73
+ end
74
+
75
+ def affiliation_names
76
+ @affiliations.map { |affil| affil&.value }
45
77
  end
46
78
 
47
79
  # @!attribute [rw] name
48
80
  # @return [String] The personal name of the creator, in the format `Family, Given`. Cannot be empty or nil.
49
- text_node :name, 'creatorName'
81
+ object_node :creator_name, 'creatorName', class: CreatorName
50
82
 
51
83
  # @!attribute [rw] given_name
52
84
  # @return [String, nil] The given name of the creator. Optional.
@@ -62,7 +94,7 @@ module Datacite
62
94
 
63
95
  # @!attribute [rw] affiliations
64
96
  # @return [Array<String>, nil] The creator's affiliations. Defaults to an empty list.
65
- array_node :affiliations, 'affiliation', class: String, default_value: []
97
+ array_node :affiliations, 'affiliation', class: Affiliation, default_value: []
66
98
 
67
99
  use_mapping :datacite_3
68
100
 
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'xml/mapping'
4
+ require 'datacite/mapping/read_only_nodes'
5
+ require 'datacite/mapping/name_identifier'
6
+ require 'datacite/mapping/name_type'
7
+
8
+ module Datacite
9
+ module Mapping
10
+ class CreatorName
11
+ include XML::Mapping
12
+ def initialize(type: nil, language: nil, value:)
13
+ self.type = type
14
+ self.language = language
15
+ self.value = value
16
+ end
17
+
18
+ def language=(value)
19
+ @language = value&.strip
20
+ end
21
+
22
+ def value=(value)
23
+ new_value = value&.strip
24
+ raise ArgumentError, 'Value cannot be empty or nil' unless new_value && !new_value.empty?
25
+
26
+ @value = new_value.strip
27
+ end
28
+
29
+ # @!attribute [rw] type
30
+ # @return [NameType, nil] the name type. Optional.
31
+ typesafe_enum_node :type, '@nameType', class: NameType, default_value: nil
32
+
33
+ # @!attribute [rw] language
34
+ # @return [String] an IETF BCP 47, ISO 639-1 language code identifying the language.
35
+ text_node :language, '@xml:lang', default_value: nil
36
+
37
+ # @!attribute [rw] value
38
+ # @return [String] the name itself.
39
+ text_node :value, 'text()'
40
+ end
41
+ end
42
+ end
@@ -27,6 +27,9 @@ module Datacite
27
27
  # @!parse ISSUED = Issued
28
28
  new :ISSUED, 'Issued'
29
29
 
30
+ # @!parse OTHER = Other
31
+ new :OTHER, 'Other'
32
+
30
33
  # @!parse SUBMITTED = Submitted
31
34
  new :SUBMITTED, 'Submitted'
32
35
 
@@ -36,6 +39,9 @@ module Datacite
36
39
  # @!parse VALID = Valid
37
40
  new :VALID, 'Valid'
38
41
 
42
+ # @!parse WITHDRAWN = Withdrawn
43
+ new :WITHDRAWN, 'Withdrawn'
44
+
39
45
  end
40
46
 
41
47
  # Represents a DataCite `<date/>` field, which can be a year, date (year-month-day or just year-month),
@@ -70,6 +76,7 @@ module Datacite
70
76
 
71
77
  def type=(val)
72
78
  raise ArgumentError, 'Date type cannot be nil' unless val
79
+
73
80
  @type = val
74
81
  end
75
82
 
@@ -89,6 +96,7 @@ module Datacite
89
96
 
90
97
  def <=>(other)
91
98
  return nil unless other.class == self.class
99
+
92
100
  %i[date_value range_start range_end type].each do |v|
93
101
  order = send(v) <=> other.send(v)
94
102
  return order if order.nonzero?
@@ -108,6 +116,10 @@ module Datacite
108
116
  # @return [DateType] the type of date. Cannot be nil.
109
117
  typesafe_enum_node :type, '@dateType', class: DateType
110
118
 
119
+ # @!attribute [rw] date_information
120
+ # @return [String] information to clarify a date
121
+ text_node :date_information, '@dateInformation', default_value: nil
122
+
111
123
  # @!method value
112
124
  # @return [String] The value as a string. May be any [W3C DateTime format](http://www.w3.org/TR/NOTE-datetime).
113
125
  text_node :value, 'text()'