4. Taxonomy架构设计

Taxonomy(分类标准)是XBRL工程的“数据宪法”。实例报文只是对Taxonomy的一次具体取值,如果Taxonomy结构混乱,后续所有实例、公式、校验和报表都会陷入返工。本节从架构视角出发,梳理分类标准的结构组织、元素定义方式、类型选择、替换组机制,以及抽象元素与具体元素的设计原则,帮助你在动手写Schema之前先想清楚“骨架”。

一、核心原理:Taxonomy的三层结构

一个可交付的XBRL Taxonomy通常由三层构成:Schema层负责元素与类型的声明,Linkbase层负责元素之间的关系(列报、计算、定义、标签、引用),扩展层负责在监管基础分类之上做行业或企业级细化。三者通过schemaRef和linkbaseRef相互引用,形成一张有向图。

Schema层是唯一“定义事实”的地方:元素名、命名空间、类型、替换组、抽象属性都在这里确定。Linkbase层不产生新元素,只描述已有元素如何被组织、计算和展示。理解这一点,就能避免把“展示顺序”写进Schema、把“计算关系”硬编码进实例这类常见错误。

XBRL Taxonomy 三层架构与引用关系 Schema 层 元素声明 / 类型 替换组 / 抽象属性 命名空间 / targetNamespace Linkbase 层 Presentation / Calculation Definition / Label / Reference 关系弧 role / arcrole 扩展层 行业/企业扩展元素 扩展 linkbase 引用基础分类 元素定义关键属性对照 属性 取值示例 设计含义 type monetaryItemType 金额型,带货币单位 substitutionGroup item / tuple 决定能否作为事实或容器 abstract true / false 抽象元素仅用于组织,不产生事实

二、方法流程:从业务概念到元素定义

设计Taxonomy不是“先写XML再想业务”,而应遵循一条可复用的流程:

  1. 概念建模:从报表、披露要求和监管规则中抽取业务概念,区分“事实型概念”(如营业收入)与“组织型概念”(如资产负债表)。
  2. 命名与命名空间规划:为每个概念分配唯一名称,确定targetNamespace,避免与基础分类冲突。
  3. 类型选择:根据数据性质选择itemType,如金额用monetaryItemType,日期用dateItemType,枚举用stringItemType配合枚举linkbase。
  4. 替换组分配:事实型元素归入item替换组,容器型元素归入tuple替换组,超立方体相关元素归入hypercubeItem或dimensionItem。
  5. 抽象属性判定:仅用于组织层级、不承载具体值的元素设为abstract="true"。
  6. Linkbase编排:在presentation中定义展示层级,在calculation中定义加减关系,在definition中定义维度关系。
建议在Schema中为每个元素补充label和reference,即使当前版本不展示,也能为后续多语言、多监管场景留出扩展空间。

三、案例场景:一个“营业收入”元素的完整定义

假设我们要为某制造业企业定义“营业收入”元素。它属于事实型概念,金额型,需要参与利润表计算,并在资产负债表中作为组织节点下的子项。其Schema片段如下:

<xs:element name="OperatingRevenue" 
            id="mfg_OperatingRevenue"
            type="xbrli:monetaryItemType"
            substitutionGroup="xbrli:item"
            abstract="false"
            nillable="true"
            xbrli:periodType="duration"
            xbrli:balance="credit">
  <xs:annotation>
    <xs:documentation>营业收入,利润表主科目</xs:documentation>
  </xs:annotation>
</xs:element>

对应的presentation linkbase中,它被挂到“利润表”抽象节点下;calculation linkbase中,它作为“营业利润”计算加项之一。注意:periodType和balance是事实型元素的关键属性,前者决定实例中必须提供期间还是时点上下文,后者决定计算关系中的正负方向。

再看一个抽象元素的例子:

<xs:element name="IncomeStatementAbstract"
            id="mfg_IncomeStatementAbstract"
            type="xbrli:stringItemType"
            substitutionGroup="xbrli:item"
            abstract="true"
            nillable="true"
            xbrli:periodType="duration"/>

该元素只用于在展示层级中充当“利润表”标题节点,实例报文中不会出现它的值。若误将其设为abstract="false",实例中就可能出现空事实,导致校验失败。

四、误区与复盘:常见设计陷阱

误区 表现 后果 修正原则
抽象元素误设为具体 组织节点abstract="false" 实例出现空事实,校验报错 仅组织用途一律abstract="true"
替换组混用 事实元素用tuple替换组 无法作为事实被实例引用 事实用item,容器用tuple
类型选择过宽 金额用stringItemType 失去货币单位与计算能力 按数据性质选择monetary/date等
命名空间冲突 扩展元素与基础分类同名 解析歧义,合并报表失败 扩展命名空间独立且语义清晰
计算关系硬编码 在Schema中写加减逻辑 Linkbase无法复用 计算关系放calculation linkbase
复盘时重点检查三件事:所有abstract="true"的元素是否真的不承载值;所有事实型元素的periodType与balance是否与业务语义一致;所有扩展元素是否都有对应的label和reference。这三项通过,Taxonomy的骨架基本可靠。

Taxonomy架构设计不是一次性工作,而是随着监管规则和业务披露需求持续演进的工程。把Schema当作“数据契约”,把Linkbase当作“关系契约”,把扩展层当作“差异契约”,三者边界清晰,后续的实例报文工程才能稳定推进。