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写错,导致解析器把元素当成未知节点。
二、方法流程: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引擎中注册前缀映射,否则会报“未定义前缀”。
三、案例场景:从实例事实反查分类标准
假设实例文档中有一条事实:<cfd:Assets contextRef="c1" unitRef="u1">1200000</cfd:Assets>。工程上要回答三个问题:这个 cfd:Assets 是什么类型?它参与哪些计算关系?它的展示位置在哪里?
- 通过命名空间前缀
cfd找到对应的Schema文件,确认Assets是monetaryItemType,且balance为debit。 - 在计算链接中查找
xlink:to="Assets"的弧,得到它的子项集合与权重。 - 在展示链接中查找
xlink:to="Assets"的弧,得到它在报表中的父节点与顺序。 - 用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断言校验。三层校验分开定位问题,能显著降低排障成本。掌握这四块基础,后续学习维度、公式、版本化分类标准时,才不会停留在“会看不会改”的层面。