class DynarexImport

Attributes

to_xml[R]

Public Class Methods

new(options={}) click to toggle source
# File lib/dynarex-import.rb, line 11
def initialize(options={})
  o = {xml: '', foreign_schema: '', schema: ''}.merge(options)
  xsl = build_xsl(o[:foreign_schema], o[:schema])    
  @to_xml = transform(xsl, o[:xml])
end

Private Instance Methods

build_xsl(foreign_schema, native_schema) click to toggle source
# File lib/dynarex-import.rb, line 19
  def build_xsl(foreign_schema, native_schema)

    a1 = capture_fields(native_schema)
    a2 = capture_fields(foreign_schema)

    h = {
      summary: [
        a1[0][0], a2[0][0], # root name, and xpath
        Hash[a1[0][-1].zip(a2[0][-1])] # summary fields
      ], 
      records: [
        a1[-1][0].to_sym, a2[-1][0], # record name, and relative record name
        Hash[a1[-1][-1].zip(a2[-1][-1])] # record fields
      ]
    }

    xsl = "<?xml version='1.0' encoding='UTF-8'?>
<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
<xsl:output method='xml' indent='yes' />

"
    xsl << "
  <xsl:template match='#{h[:summary][1]}'>
    <xsl:element name='#{h[:summary][0]}'>
      <xsl:element name='summary'>
    "

    h[:summary][-1].each do |key,value|
      xsl << "
        <xsl:element name='#{key}'>
          <xsl:value-of select='#{value}'/>
        </xsl:element>
      "
    end

    xsl << "
        <recordx_type>dynarex</recordx_type>
        <schema>#{native_schema}</schema>
      </xsl:element>

      <xsl:element name='records'>
        <xsl:apply-templates select='#{h[:records][0]}'/>  
      </xsl:element>

    </xsl:element>

  </xsl:template>

  <xsl:template match='#{h[:records][1]}'>
    <xsl:element name='#{h[:records][0]}'>
    "

    h[:records][-1].values.each do |value|
      xsl << "
      <xsl:apply-templates select='#{value}'/>"
    end

    xsl << "

    </xsl:element>
     <xsl:text>
    </xsl:text>
    "

    xsl << "
  </xsl:template>        
    "

    h[:records][-1].each do |key,value|
      xsl << "
  <xsl:template match='#{value}'>
    <xsl:element name='#{key}'>
      <xsl:value-of select='.'/>
    </xsl:element>
  </xsl:template>
      "
    end

    xsl << "
</xsl:stylesheet>        
    "
    xsl

  end
capture_fields(schema) click to toggle source
# File lib/dynarex-import.rb, line 104
def capture_fields(schema)
  rec_name, raw_rec_fields = schema.match(/(\w+)\(([^\)]+)\)$/).captures
  rec_fields = raw_rec_fields.split(',').map(&:strip)

  summary_name, raw_summary_fields = ($`).match(/([^\[]+)(\[([^\]]+)\]\/)?$/)\
    .captures.values_at(0, -1)
  summary_fields = raw_summary_fields.split(',').map(&:strip)

  [[summary_name, summary_fields], [rec_name, rec_fields]]
end
transform(xsl, xml) click to toggle source
# File lib/dynarex-import.rb, line 115
def transform(xsl, xml)
  Rexslt.new(xsl, xml).to_s
end