lib/saxon/axis_iterator.rb
require_relative 's9api'
module Saxon
# An iterator across an XPath axis of an XDM document, e.g. down to children
# (+child+), up to the root (+ancestor+)
# @example iterate over child nodes
# AxisIterator.new(node, :child).each do |child_node|
# puts child_node.node_name
# end
class AxisIterator
include Enumerable
attr_reader :s9_xdm_node, :s9_axis
private :s9_xdm_node, :s9_axis
def initialize(xdm_node, axis)
@s9_xdm_node = xdm_node.to_java
@s9_axis = Saxon::S9API::Axis.const_get(axis.to_s.upcase.to_sym)
end
# @return [Saxon::S9API::XdmSequenceIterator] A new Saxon Java XDM sequence iterator.
def to_java
s9_sequence_iterator
end
# yields each node in the sequence
# @yieldparam [Saxon::XDM::Node] the next node in the sequence
def each(&block)
s9_sequence_iterator.lazy.map { |s9_xdm_node| Saxon::XDM::Node.new(s9_xdm_node) }.each(&block)
end
private
def s9_sequence_iterator
s9_xdm_node.axisIterator(s9_axis)
end
end
end