はじめに
前回はXBRLのスキーマファイルを調べて、要素を分類しました。今回は要素の日本語名称を取得します。
現段階だと、要素の識別子(id)はjppfs_cor_NetSalesのような英字なので、何なのかわかりにくいです。ちなみにこれは売上高です。
日本語名称を取得するためには名称リンクベースファイルを読み込む必要があります。
開発環境
- windows 10 home
- python 3.7.4
- K2Editor(テキストエディタ) + コマンドプロンプト
使用したpythonの外部ライブラリ
少なくとも以下の外部ライブラリを利用しているのでインストールしていなければpipコマンドでインストールしてください。
- pysqlite3
- requests
- beautifulsoup4
- lxml
名称リンクベースファイルの一覧を取得する
XBRLが参照している名称リンクベースファイルの一覧を取得するには、XBRLのzipファイル中に存在するスキーマファイルを調べればよいです。EDINETサーバー上のものではだめです。
スキーマファイルのおおよその構造は以下の通りです。
<import A>・・・他のスキーマファイルへの参照を定義 <import B> ・・・ <linkbaseRef A>・・・リンクベースファイルへの参照を定義 <linkbaseRef B> ・・・ <element A>・・・XBRL中の要素を定義 <element B> ・・・
スキーマファイルについては前回の記事で言及しているので詳しくは説明しません。
リンクベースファイルへの参照はlinkbaseRef要素をみればわかります。以下はlinkbaseRef要素の具体例です。一つだけ抜粋しています。
<link:linkbaseRef xlink:type="simple" xlink:href="http://disclosure.edinet-fsa.go.jp/taxonomy/jpcrp/2015-03-31/label/jpcrp_2015-03-31_lab.xml" xlink:role="http://www.xbrl.org/2003/role/labelLinkbaseRef" xlink:arcrole="http://www.w3.org/1999/xlink/properties/linkbase" />
href属性が参照しているリンクベースファイルのURIです。今回は日本語名称が欲しいのでURIがlab.xmlで終わっているものだけを抜き出します。以下は処理結果の例です。
http://disclosure.edinet-fsa.go.jp/taxonomy/jppfs/2015-03-31/label/jppfs_2015-03-31_lab.xml http://disclosure.edinet-fsa.go.jp/taxonomy/jpdei/2013-08-31/label/jpdei_2013-08-31_lab.xml jpcrp030000-asr-001_E31037-000_2015-12-31_01_2016-03-30_lab.xml
これでXBRLが参照している名称リンクベースファイルの一覧がわかりました。
名称リンクベースファイルの構造概要
名称リンクベースファイルには要素の名称文字列が記載されています。
名称リンクベースファイルは「jpcrp030000-asr-001_E31037-000_2015-12-31_01_2016-03-30_lab.xml」のようにファイル名が「lab.xml」で終わるファイルのことです。
名称リンクベースファイルのおおよその構造です。
<roleRef A> ・・・ 日本語名称のロールを定義 <roleRef B> ・・・ <labelLink> <loc A> XBRLに存在する要素A(jppfs_cor_NetSalesなど)に対応 <labelArc A1> 要素Aの一つ目の日本語名称へのリンク <labelArc A2> 要素Aの二つ目の日本語名称へのリンク <label A1> 要素Aの一つ目の日本語名称 <label A2> 要素Aの二つ目の日本語名称 ・・・ </labelLink>
先頭にロール定義が並んでいます。これは表示リンクベースファイル中の優先ラベルに対応しています。その下に要素ごとの日本語名称定義が続いています。構造は正確ではないですが、大体こんな感じだとおもってくれていいです。
要素に対応する日本語名称が複数あるため途中にlabelArcというリンク要素を挟んでいるのが、少し複雑ですね。
loc要素の説明
loc要素は日本語名称が存在するXBRL中の要素(jppfs_cor_NetSalesなど)を定義しています。以下はloc要素の具体例です。一つだけ抜粋しています。
<link:loc xlink:type="locator" xlink:href="../jppfs_cor_2015-03-31.xsd#jppfs_cor_AssetsAbstract" xlink:label="AssetsAbstract"/>
href属性が日本語名称が存在するXBRL中の要素のURIを定義しており、label属性が名称リンクベースファイル中での名称を定義しています。
上記の例だと、「../jppfs_cor_2015-03-31.xsd#jppfs_cor_AssetsAbstract」を「AssetsAbstract」と呼ぶといった定義となっています。
labelArc要素の説明
labelArc要素はXBRL中の要素がどの日本語名称にリンクしているのかを定義しています。以下はlabelArc要素の具体例です。必要数だけ抜粋しています。
<link:labelArc xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/concept-label" xlink:from="AssetsAbstract" xlink:to="label_AssetsAbstract"/> <link:labelArc xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/concept-label" xlink:from="AssetsAbstract" xlink:to="label_AssetsAbstract_2"/>
from属性がXBRL中の要素名、to属性がリンク先の日本語名称定義を表しています。
上記の例だと、XBRL中の要素「AssetsAbstract」が日本語名称定義「label_AssetsAbstract、label_AssetsAbstract_2」へのリンクを有していることがわかります。
label要素の説明
label要素が日本語名称そのものを定義しています。以下はlabel要素の具体例です。必要数だけ抜粋しています。
<link:label xlink:type="resource" xlink:label="label_AssetsAbstract" xlink:role="http://www.xbrl.org/2003/role/label" xml:lang="ja" id="label_AssetsAbstract"> 資産の部 </link:label> <link:label xlink:type="resource" xlink:label="label_AssetsAbstract_2" xlink:role="http://www.xbrl.org/2003/role/verboseLabel" xml:lang="ja" id="label_AssetsAbstract_2"> 資産の部 [タイトル項目] </link:label>
label属性が日本語名称定義紐づけのためのリンク名、role属性がロール、タグ付けされたテキストが日本語名称を定義しています。
上記の例だと
- 日本語名称「資産の部」のロールは「http://www.xbrl.org/2003/role/label」、「label_AssetsAbstract」に紐づけされている
- 日本語名称「資産の部 [タイトル項目]」のロールは「http://www.xbrl.org/2003/role/verboseLabel」、「label_AssetsAbstract_2」に紐づけされている
といった感じの定義となっています。
ロールは日本語名称の役割を示しています。XBRL中の要素には複数の日本語名称が割り当てられています。例えば財務諸表という要素は
- 連結の役割を果たす場合は「連結財務諸表」
- 単体の役割を果たす場合は「財務諸表」
という日本語名称が割り当てられています。
ここでの「連結」とか「単体」といったものがロールに当たります。
表示リンクベースファイルで優先ラベルという属性がありましたが、これは優先して表示するロールのことを定義しています。優先ラベルが「連結」であればロールが「連結」である日本語名称を優先して表示することになります。
名称リンクベースファイルから日本語名称の一覧を取得する
loc、labelArc、labelを読み込むことでXBRL中の要素の日本語名称一覧を取得可能です。以下は取得例です。一部を抜粋、csv形式で記載しています。
要素id,ロール,日本語名称 jppfs_cor_NetSalesAbstract,http://www.xbrl.org/2003/role/label,売上高 jppfs_cor_NetSalesAbstract,http://www.xbrl.org/2003/role/verboseLabel,売上高 [タイトル項目] jppfs_cor_GrossSalesRevOA,http://www.xbrl.org/2003/role/label,総売上高 jppfs_cor_GrossSalesRevOA,http://www.xbrl.org/2003/role/verboseLabel,総売上高、営業活動による収益 jppfs_cor_SalesAllowanceAndReturnsRevOA,http://www.xbrl.org/2003/role/label,売上値引及び戻り高 jppfs_cor_SalesAllowanceAndReturnsRevOA,http://www.xbrl.org/2003/role/verboseLabel,売上値引及び戻り高、営業活動による収益 jppfs_cor_NetSales,http://www.xbrl.org/2003/role/label,売上高 jppfs_cor_NetSales,http://www.xbrl.org/2003/role/verboseLabel,売上高 jppfs_cor_NetSales,http://www.xbrl.org/2003/role/totalLabel,売上高合計 jppfs_cor_NetSalesOfGoodsRevOA,http://www.xbrl.org/2003/role/label,商品売上高 jppfs_cor_NetSalesOfGoodsRevOA,http://www.xbrl.org/2003/role/verboseLabel,商品売上高、営業活動による収益 ・・・
要素の日本語名称を取得する
日本語名称の取得処理は表示リンクベースファイル中の各要素に対して行います。
優先ラベルに応じて取得するべき日本語名称が変わるので注意してください。また、要素の日本語名称を取得するたびに名称リンクベースファイルを分析すると時間がかかってしまいます。名称リンクベースファイルをあらかじめ分析してキャッシュしておくことをお勧めします。
ソースコードはここに公開しています。
具体的な処理はXBRLAnalysis.pyの252行目以降に記載しています。
以下が実行結果です。
(None)rol_ConsolidatedStatementOfIncome(None) (heading)jppfs_cor_ConsolidatedStatementOfIncomeHeading(連結損益計算書) (table)jppfs_cor_StatementOfIncomeTable(連結損益計算書) (axis)jppfs_cor_ConsolidatedOrNonConsolidatedAxis(連結個別) (member)jppfs_cor_ConsolidatedMember(連結) (line_items)jppfs_cor_StatementOfIncomeLineItems(連結損益計算書) (number)jppfs_cor_NetSales(売上高) (number)jppfs_cor_CostOfSales(売上原価) (number)jppfs_cor_GrossProfit(売上総利益) (number)jppfs_cor_SellingGeneralAndAdministrativeExpenses(販売費及び一般管理費) (number)jppfs_cor_OperatingIncome(営業利益) (title)jppfs_cor_NonOperatingIncomeAbstract(営業外収益) (number)jppfs_cor_InterestIncomeNOI(受取利息) (number)jppfs_cor_DividendsIncomeNOI(受取配当金) (number)jppfs_cor_ForeignExchangeGainsNOI(為替差益) (number)jppfs_cor_SubsidyIncomeNOIBounty(助成金収入) (number)jppfs_cor_OtherNOI(その他) (number)jppfs_cor_NonOperatingIncome(営業外収益合計) (title)jppfs_cor_NonOperatingExpensesAbstract(営業外費用) (number)jppfs_cor_InterestExpensesNOE(支払利息) (number)jppfs_cor_StockIssuanceCostNOE(株式交付費) (number)jppfs_cor_OtherNOE(その他) (number)jppfs_cor_NonOperatingExpenses(営業外費用合計) (number)jppfs_cor_OrdinaryIncome(経常利益) (title)jppfs_cor_ExtraordinaryIncomeAbstract(特別利益) (number)jppfs_cor_GainOnSalesOfNoncurrentAssetsEI(固定資産売却益) (number)jppfs_cor_GainOnSalesOfInvestmentSecuritiesEI(投資有価証券売却益) (number)jppfs_cor_ExtraordinaryIncome(特別利益合計) (title)jppfs_cor_ExtraordinaryLossAbstract(特別損失) (number)jppfs_cor_LossOnSalesOfNoncurrentAssetsEL(固定資産売却損) (number)jppfs_cor_LossOnRetirementOfNoncurrentAssetsEL(固定資産除却損) (number)jppfs_cor_ImpairmentLossEL(減損損失) (number)jppfs_cor_ExtraordinaryLoss(特別損失合計) (number)jppfs_cor_IncomeBeforeIncomeTaxes(税金等調整前当期純利益) (number)jppfs_cor_IncomeTaxesCurrent(法人税、住民税及び事業税) (number)jppfs_cor_IncomeTaxesDeferred(法人税等調整額) (number)jppfs_cor_IncomeTaxes(法人税等合計) (number)jppfs_cor_IncomeBeforeMinorityInterests(少数株主損益調整前当期純利益) (number)jppfs_cor_NetIncome(当期純利益)
要素の日本語名称を取得することが出来ました。やはり日本語があると何がどこにあるのかわかりやすいですね。