image

  • フォト Amazonギフト券
    ※この時計の時刻は、閲覧しているパソコンのものであり、必ずしも正確な時間とは限りません

検索

最近のトラックバック

無料ブログはココログ

« ピックアップ:「Firefox」をWYSIWYG編集可能なブログ投稿ソフトにできる, 4足歩行ロボット「ビッグドッグ」のパロディービデオ, etc... | トップページ | ピックアップ: 「グリー」モバイルで女性会員急増, 都庁の落書きがスゴすぎる, etc... »

2008-03-29

XBRL を ruby ソースに変換するってどう?

XBRL データを ruby ソースに変換してしまうと良いのではないか? と考え始めている。
ともかく XBRL データを DOM で扱うのは面倒なのだ!

XBRLの本家サイトにあるサンプルデータを使って、考えていることを以下に示していこう。
# ここでは手書きで ruby コードを起こしているが、本当はプログラムで自動変換をさせることになる。

使用したデータは
- http://www.xbrl.org/SpecRecommendations/
   2.1 Conformance Suite (Candidate Recommendation 3)   March 5, 2007
   Full Test Suite zip ( http://www.xbrl.org/2007/XBRL-CONF-CR3-2007-03-05.zip )
   XBRL-CONF-CR3-2007-03-05/Common/397-00-ConsistentInstance-valid.xbrl
                                   397-ABC.xsd
                                   397-ABC-calculation.xml

この3ファイルに相当する ruby ソースをつくる。
  1. XBRl 汎用のクラス定義
  2. 397-ABC.xsd, 397-ABC-calculation.xml に対応するクラス定義
  3. 397-00-ConsistentInstance-valid.xbrl の対応するクラス定義

1. XBRl 汎用のクラス定義

$ cat XbrlBase.rb

#----------------------
class XbrlElement
  attr_reader :name, :id, :type, :substutionGroup, :nillable, :periodType

  def initialize(name, id, type, substutionGroup, nillable, periodType)
    @name = name
    @id = id
    @type = type
    @substutionGroup = substutionGroup
    @nillable = nillable
    @periodType = periodType
  end
end

class XbrlCalculation
  attr_reader :arcs

  def initialaize(arcs)
    @arcs = arcs
  end
end

class CalculationArc
  attr_reader :arcrole, :from, :to, :weight
  def initialaize(arcsrole, from, to, weight)
    @arcsrole = arcrole
    @from = from
    @to = to
    @weight = weight
  end
end

class XbrlInsntance
  attr_reader :xsd
  attr_reader :items, :contexts, :units

  def initialize(items, contexts, units)
    @items = items
    @contexts = contexts
    @units = units
  end
end
#--- End of File ---


2. 397-ABC.xsd, 397-ABC-calculation.xml に対応するクラス定義

まず、xsd ファイルと xml を示す。
$ cat 397-ABC.xsd
<?xml version="1.0"?>
<!-- XBRL 2.1 Tests -->
<!-- Copyright 2003 XBRL International Inc.  See www.xbrl.org/legal.  All Rights Reserved. -->
<schema targetNamespace="http://xbrl.example.com/397/ABC"
  xmlns:abc="http://xbrl.example.com/397/ABC"
  xmlns="http://www.w3.org/2001/XMLSchema"
  xmlns:xbrli="http://www.xbrl.org/2003/instance"
  xmlns:link="http://www.xbrl.org/2003/linkbase"
  xmlns:xlink="http://www.w3.org/1999/xlink"
  elementFormDefault="qualified">

        <import namespace="http://www.xbrl.org/2003/instance"
          schemaLocation="../lib/xbrl-instance-2003-12-31.xsd"/>

  <annotation>
    <appinfo>
      <link:linkbaseRef xlink:type="simple"
                        xlink:arcrole="http://www.w3.org/1999/xlink/properties/linkbase"
                        xlink:href="397-ABC-calculation.xml" />      
    </appinfo>
  </annotation>

        <element  name="A"
            id="A"
            type="xbrli:monetaryItemType"
            substitutionGroup="xbrli:item"
            nillable="true"
            xbrli:periodType="instant"/>

        <element  name="B"
            id="B"
            type="xbrli:monetaryItemType"
            substitutionGroup="xbrli:item"
            nillable="true"
            xbrli:periodType="instant"/>

        <element  name="C"
            id="C"
            type="xbrli:monetaryItemType"
            substitutionGroup="xbrli:item"
            nillable="true"
            xbrli:periodType="instant"/>

</schema>

$ cat 397-ABC-calculation.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright 2005 XBRL International Inc.  See www.xbrl.org/legal.  All Rights Reserved. -->
<linkbase xmlns="http://www.xbrl.org/2003/linkbase"
          xmlns:xlink="http://www.w3.org/1999/xlink"
          >

        <calculationLink xlink:type="extended" xlink:role="http://www.xbrl.org/2003/role/link">

                <loc xlink:type="locator" xlink:href="397-ABC.xsd#A" xlink:label="summationItem" />
                <loc xlink:type="locator" xlink:href="397-ABC.xsd#B" xlink:label="contributingItem" />
                <loc xlink:type="locator" xlink:href="397-ABC.xsd#C" xlink:label="contributingItem" />

    <!-- A = B + C -->
                <calculationArc xlink:type="arc"
                    xlink:arcrole="http://www.xbrl.org/2003/arcrole/summation-item"
                    xlink:from="summationItem"
                    xlink:to="contributingItem"
                    weight="1"/>

  </calculationLink>

</linkbase>

これに対応する ruby ソースを次に示す。
$ cat ABC_xsd.rb
require 'XbrlBase'

#-------- 397-ABC.xsd ----------
class A < XbrlElement
  def A.inst
    A.new("A", "A", :monetaryItemType, :item, true, :instant)
  end
end

class B < XbrlElement
  def B.inst
    B.new("B", "B", :monetaryItemType, :item, true, :instant)
  end
end

class C < XbrlElement
  def C.inst
    ans = C.new("C", "C", :monetaryItemType, :item, true, :instant)
  end
end

#----- 397-ABC-calculation.xml ---
class ABC_Calc < XbrlCalculation
  def inst
    arc = CalculationArc.new("http://www.xbrl.org/2003/arcrole/summation-item",
                             :summationItem, :contributingItem, 1)
    arcs = [arc]
    ABC_Calc.new(arcs)
  end
end

3. 397-00-ConsistentInstance-valid.xbrl の対応するクラス定義

まず、XBRL データを示す。
$ cat 397-00-ConsistentInstance-valid.xbrl
<?xml version="1.0"?>
<!-- Copyright 2005 XBRL International Inc.  See www.xbrl.org/legal.  All Rights Reserved. -->
<xbrl xmlns="http://www.xbrl.org/2003/instance"
      xmlns:link="http://www.xbrl.org/2003/linkbase"
      xmlns:xlink="http://www.w3.org/1999/xlink"
      xmlns:abc="http://xbrl.example.com/397/ABC"
      xmlns:iso4217="http://www.xbrl.org/2003/iso4217"
      >

        <link:schemaRef xlink:href="397-ABC.xsd" xlink:type="simple"/>

  <!-- A = B + C -->
        <abc:B contextRef="c1" unitRef="u1" precision="INF">1</abc:B>
        <abc:C contextRef="c1" unitRef="u1" precision="INF">2</abc:C>
        <abc:A contextRef="c1" unitRef="u1" precision="INF">3</abc:A>

        <context id="c1">
                <entity>
                        <identifier scheme="www.example.com">example</identifier>
                </entity>
                <period>
                        <instant>2003-03-31</instant>
                </period>
        </context>

        <unit id="u1">
                <measure>iso4217:USD</measure>
        </unit>

</xbrl>

これに対応する ruby ソースを示す。
$ cat sample01-instance.rb

require 'ABC_xsd'
require 'pp'

#-------- 397-00-ConsistentInstance-valid.xbrl -----------
class Sample01Instance < XbrlInsntance
  @links = [:calc => ABC_Calc.new]

  def Sample01Instance.inst
    items = []
    items << {:element => B.inst, :val =>1, :presoson =>:INF , :contextRef => :c1, :unitRef =>:u1}
    items << {:element => C.inst, :val =>2, :presoson =>:INF , :contextRef => :c1, :unitRef =>:u1}
    items << {:element => A.inst, :val =>3, :presoson =>:INF , :contextRef => :c1, :unitRef =>:u1}

    contexts = {}
    contexts[:c1] = {:entity => "example", :period => "2003-03-31"}

    units = {}
    units[:u1] = :iso4217_USD

    Sample01Instance.new(items, contexts, units)
  end
end

#---- Main ----
if __FILE__ == $0

inst = Sample01Instance.inst

  inst.items.each {|item|
    contextRef = item[:contextRef]
    period = inst.contexts[contextRef][:period]
    puts "#{item[:element].name}   #{item[:val]} [#{period}]"
  }
end
#--- End of File ---

これには, 科目の名前、値、コンテキストを列挙するアプリも追加してある。
この最後のソースを走らせてみれば、次のようになる。

$ ruby sample01-instance.rb
B   1 [2003-03-31]
C   2 [2003-03-31]
A   3 [2003-03-31]

erb を利用するなどすれば、HTML の表形式で出力することも可能だろう。

XBRL データが表現してことを ruby クラス/オブジェクトとして表現しているので、
ruby の機能をつかって柔軟なデータ処理が可能となる。
上記 XBRL では、XBRL 共通の xsd, xml が実際には参照されているが、その 部分の ruby ソース化はしていない。
実際には、すべての xsd, xml を ruby ソースに変換する必要がある。
そうしておけば、XBRL データ中からの XBRL/EDINT の共通フィアルへ参照は、
ruby 中では 単なる require 文に置換することができる。

インスタンス編集は、ruby オブジェクトの変更と同一視することもでき、エディタでの編集補完機能や、
プログラム実行時のリフレクションなどをつかって編集をするなんてことが可能になる。

« ピックアップ:「Firefox」をWYSIWYG編集可能なブログ投稿ソフトにできる, 4足歩行ロボット「ビッグドッグ」のパロディービデオ, etc... | トップページ | ピックアップ: 「グリー」モバイルで女性会員急増, 都庁の落書きがスゴすぎる, etc... »

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/184434/40680700

この記事へのトラックバック一覧です: XBRL を ruby ソースに変換するってどう?:

« ピックアップ:「Firefox」をWYSIWYG編集可能なブログ投稿ソフトにできる, 4足歩行ロボット「ビッグドッグ」のパロディービデオ, etc... | トップページ | ピックアップ: 「グリー」モバイルで女性会員急増, 都庁の落書きがスゴすぎる, etc... »

mokuji

2013年12月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

google

  • twitter
  • __
  • _
    Googleボットチェッカー

合わせて読む

  • 合わせて読む
    フィードメーター - katoy: cocolog あわせて読みたい

リンク