4.7.7 IDの採番をするインスタンス文書の作成

インスタンス文書に記述されているIDは,XML文書内で一意にする必要があります。IDには,アイテムやタプルのid属性,脚注リンクのロケータのxlink:loc属性,リソースのxlink:label属性など,複数あります。XBRL2.1の場合,uCosminexus Business Reporting Processorでは,ユーザー任意の形式でこれらのIDを付けることができます。

任意の形式でid属性を付ける場合,あらかじめID採番クラスをユーザーが作成しておきます。IDを採番したいインスタンス文書の新規作成時,インスタンス文書を表すXBRLInstanceDocumentオブジェクトにID採番クラスのオブジェクトを設定することで,インスタンス文書にIDを付けることができます。

ここでは,使用するインターフェース,ID採番クラスの作成例,およびインスタンス文書の新規作成時にID採番クラスを設定する例を示します。

<この項の構成>
(1) 使用するクラスおよびインターフェース
(2) ID採番クラスの作成
(3) ID採番クラスのインスタンス文書への組み込み

(1) 使用するクラスおよびインターフェース

IDの採番で使用するクラスおよびインターフェースを次の表に示します。

表4-33 IDの採番で使用するクラスおよびインターフェース

項番使用するクラスおよびインターフェース説明
1com.hitachi.xbrl.util.XBRLIdCreatorXBRL文書のIDを生成するためのインターフェースです。ユーザーはこのインターフェースを実装して,ID採番クラスを作成します。
2com.hitachi.xbrl.util.XBRLIdManagerXBRL文書に記述されたIDを管理します。ユーザーが新規にインスタンスを生成できます。また,インスタンス文書を表すXBRLInstanceDocumentオブジェクトのgetIdManager()メソッドを使用して,IDを管理するXBRLIdManagerオブジェクトを取得できます。

(2) ID採番クラスの作成

XBRLIdCreatorインターフェースを実装して,ユーザー独自のID採番クラスを作成します。実装したID採番クラスのオブジェクトを,IDを一元管理するXBRLIdManagerオブジェクトに設定します。その結果,IDが必要になったときに採番オブジェクトがコールバックされ,指定した形式でIDが採番されます。

ID採番クラスのオブジェクトをXBRLIdManagerオブジェクトに設定するには,XBRLIdManagerクラスのsetIdCreator()メソッドを使用します。

XBRLIdCreatorインターフェースを実装したサンプルコード(MyIdCreator.java)は次のとおりです。

import java.text.NumberFormat;

import com.hitachi.xbrl.util.XBRLIdCreator;
import com.hitachi.xbrl.util.XBRLIdManager;

/**
* XBRLIdCreator の実装クラス
*/
public class MyIdCreator implements XBRLIdCreator {

   // 要素別カウンター
   private int fnt_counter = 0;
   private int loc_counter = 0;
   private int id_counter = 0;

   // コンストラクタ
   public MyIdCreator() {
   }

   /**
    * IDを生成する
    * フォーマット:{要素を識別する文字列}_{要素別の通し番号}
    */
   public String createId(int type, XBRLIdManager idManager) {
       String rtnValue = null;

       switch (type) {
       case FOOTNOTE_LABEL:
           rtnValue = createFootnoteLabel(idManager);
           break;
       case LOC_LABEL:
           rtnValue = createLocatorLabel(idManager);
           break;
       case ITEM_ID:
       case TUPLE_ID:
       case XBRL_ID:
       case CONTEXT_ID:
       case UNIT_ID:
       case FOOTNOTE_LINK_ID:
       case FOOTNOTE_ID:
           rtnValue = createElementId(idManager);
           break;
       }

       return rtnValue;
   }

   /**
    * ID の重複を調べて重複しない ID を返す
    */
   private static String checkId(String str, int counter, XBRLIdManager idManager) {
       String rtnValue = null;

       NumberFormat nf = NumberFormat.getInstance();
       nf.setGroupingUsed(false);
       nf.setMinimumIntegerDigits(3);

       rtnValue = str + nf.format(counter);

       if (idManager.isId(rtnValue)) {
           rtnValue = null;
       }

       return rtnValue;
   }

   /**
    * 脚注のラベルを生成
    */
   private String createFootnoteLabel(XBRLIdManager idManager) {
       final String prefix = "FNT";
       String rtnValue = null;

       while (null == rtnValue) {
           fnt_counter++;
           rtnValue = checkId(prefix, fnt_counter, idManager);
       }

       return rtnValue;
   }

   /**
    * ロケータのラベルを生成
    */
   private String createLocatorLabel(XBRLIdManager idManager) {
       final String prefix = "LOC";
       String rtnValue = null;

       while (null == rtnValue) {
           loc_counter++;
           rtnValue = checkId(prefix, loc_counter, idManager);
       }

       return rtnValue;
   }

   /**
    * 要素の ID を生成
    */
   private String createElementId(XBRLIdManager idManager) {
       final String prefix = "ID";
       String rtnValue = null;

       while (null == rtnValue) {
           id_counter++;
           rtnValue = checkId(prefix, id_counter, idManager);
       }

       return rtnValue;
   }
}

(3) ID採番クラスのインスタンス文書への組み込み

作成したID採番クラスをインスタンス文書に組み込みます。

ID採番クラスの組み込みでは,次が必要です。

一つのXML文書内に複数のインスタンス文書がある場合
XBRLIdManagerは,複数のXBRLInstanceDocumentオブジェクトを管理できます。その結果,一つのXML文書内にある複数のインスタンス文書間で,IDを一意にできます。
一つのXML文書内にある複数のインスタンス文書間でIDを一意にしたい場合,同じID採番クラスのオブジェクトをXBRLIdManagerオブジェクトに設定し,すべてのXBRLInstanceDocumentオブジェクトを同じXBRLIdManagerオブジェクトに登録します。

ID採番クラスを組み込むサンプルコードは次のとおりです。


(中略)

// 新たなインスタンス文書の作成
XBRLInstanceDocument idoc = ib.newInstanceDocument(tdoc);

/*
* === ID採番方法の設定 ===
* XBRLIdManagerを生成し,作成した自動採番方法を設定
* このXBRLIdManagerでインスタンス文書を管理させ,以降設定した自動採番方法でIDを採番する
*/
MyIdCreator myCreator = new MyIdCreator();
XBRLIdManager im = new XBRLIdManager();
im.setIdCreator((XBRLIdCreator) myCreator);
im.registerDocument(idoc);

(中略)