3. XML与XLink基础

XBRL(可扩展商业报告语言)并不是凭空发明的独立格式,它的分类标准(Taxonomy)与实例文档(Instance)本质上都是XML文档。要真正读懂并工程化处理XBRL,必须先掌握四块底层基石:XML语法、命名空间、XML Schema,以及XLink与XPath。本章把这四块内容串成一条从“文档结构”到“语义链接”再到“定位查询”的完整链路。

一、核心原理:XML语法与命名空间

XML是一种自描述、可嵌套的标记语言。一个合法的XML文档必须满足:有且仅有一个根元素;标签成对闭合或自闭合;属性值必须加引号;元素名区分大小写。XBRL实例文档的根元素通常是 xbrli:xbrl,分类标准入口文件则可能是 xsd:schema 或 link:linkbase。

<?xml version="1.0" encoding="UTF-8"?>
<xbrli:xbrl
    xmlns:xbrli="http://www.xbrl.org/2003/instance"
    xmlns:link="http://www.xbrl.org/2003/linkbase"
    xmlns:iso4217="http://www.xbrl.org/2003/iso4217">
  <xbrli:context id="c1">
    <xbrli:entity>
      <xbrli:identifier scheme="http://www.sse.com.cn">600000</xbrli:identifier>
    </xbrli:entity>
    <xbrli:period>
      <xbrli:instant>2024-12-31</xbrli:instant>
    </xbrli:period>
  </xbrli:context>
</xbrli:xbrl>

命名空间(Namespace)解决的是“同名不同义”问题。XBRL中 context、unit、identifier 等概念来自instance命名空间,而 linkbaseRef、roleRef 来自linkbase命名空间。前缀只是别名,真正决定语义的是URI。工程上最常见的错误是:前缀写对但URI写错,导致解析器把元素当成未知节点。

记忆要点:前缀是“外号”,URI才是“身份证”。校验XBRL时,先看命名空间声明,再看元素本地名。

二、方法流程:Schema、XLink与XPath的协作

XBRL分类标准用XML Schema定义元素(element)与类型(type),例如 monetaryItemType、stringItemType、dateItemType。Schema负责“有哪些概念、什么数据类型、是否可空”。而概念之间的计算、展示、定义、标签关系,则由XLink在linkbase中表达。

XLink的核心是弧(arc)与角色(role)。角色定义“这条链接表达什么关系”,弧定义“从哪个源到哪个目标、方向如何、权重多少”。例如计算链接中,calculationArc 的 weight 为1表示加,为-1表示减。展示链接则用 presentationArc 控制父子层级与顺序。

<link:calculationLink
    xlink:type="extended"
    xlink:role="http://www.example.com/role/ConsolidatedBalanceSheet">
  <link:loc xlink:type="locator"
      xlink:href="#" aria-disabled="true" data-keke-missing-local-link="1" onclick="return false"
      xlink:label="Assets"/>
  <link:loc xlink:type="locator"
      xlink:href="#" aria-disabled="true" data-keke-missing-local-link="1" onclick="return false"
      xlink:label="CurrentAssets"/>
  <link:calculationArc xlink:type="arc"
      xlink:from="Assets" xlink:to="CurrentAssets"
      xlink:arcrole="http://www.xbrl.org/2003/arcrole/summation-item"
      weight="1"/>
</link:calculationLink>

XPath是定位XML节点的查询语言。在XBRL中,XPath用于公式链接(Formula Linkbase)、断言(Assertion)以及实例校验。例如要选出所有上下文为 c1 的金额型事实,可以写成:

//*[local-name()='contextRef' and .='c1']
  /parent::*[namespace-uri()='http://www.xbrl.org/2003/instance']

实际工程中更常用的是带命名空间前缀的写法,但必须先在XPath引擎中注册前缀映射,否则会报“未定义前缀”。

XML语法 根元素 / 闭合 / 属性 命名空间声明 XML Schema 元素 / 类型 / 可空性 概念定义 XLink 角色 / 弧 / 定位器 计算与展示关系 XPath 节点定位 / 断言 公式求值 定义 链接 查询 定位目标 实例文档 事实 / 上下文 / 单位 xbrli:xbrl 校验

三、案例场景:从实例事实反查分类标准

假设实例文档中有一条事实:<cfd:Assets contextRef="c1" unitRef="u1">1200000</cfd:Assets>。工程上要回答三个问题:这个 cfd:Assets 是什么类型?它参与哪些计算关系?它的展示位置在哪里?

  1. 通过命名空间前缀 cfd 找到对应的Schema文件,确认 Assets 是 monetaryItemType,且 balance 为 debit。
  2. 在计算链接中查找 xlink:to="Assets" 的弧,得到它的子项集合与权重。
  3. 在展示链接中查找 xlink:to="Assets" 的弧,得到它在报表中的父节点与顺序。
  4. 用XPath定位所有引用该概念的实例事实,做批量一致性检查。

这个过程说明:Schema定义“是什么”,XLink定义“怎么连”,XPath定义“怎么找”。三者缺一不可。

技术 在XBRL中的职责 典型文件 常见错误
XML语法 保证文档结构合法 实例文档、Schema、Linkbase 标签未闭合、属性未加引号
命名空间 区分不同词汇表 所有XBRL文件 前缀与URI不匹配
XML Schema 定义概念与数据类型 *.xsd 类型不兼容、元素重复定义
XLink 表达概念间关系 *-cal.xml、*-pre.xml 弧的from/to标签不存在
XPath 定位与断言 Formula、Assertion 未注册命名空间前缀

四、误区与复盘

误区一:把前缀当成固定标准。前缀可以任意命名,真正生效的是URI。不同企业可能用 cfd、cas、ifrs 表示同一套分类标准。

误区二:认为XLink只是“超链接”。XBRL中的XLink是语义关系载体,弧的 arcrole 和 weight 直接决定计算校验结果。

误区三:XPath中忽略命名空间。在XBRL实例中,//Assets 通常匹配不到任何节点,因为元素属于特定命名空间,必须使用 //cfd:Assets 或 local-name() 方式。

复盘建议:在搭建XBRL处理流水线时,先做XML良构性校验,再做Schema有效性校验,最后做XLink关系与XPath断言校验。三层校验分开定位问题,能显著降低排障成本。掌握这四块基础,后续学习维度、公式、版本化分类标准时,才不会停留在“会看不会改”的层面。