ADR-0035:XML 有界块级格内容
- 日期:2026-10-16。
- 状态:已采纳;受支持子集已通过阶段二十八验收。
- 依据:ADR-0034、XML 模板 API。
决策
XML 版本 1 子集扩展直接格内容 <cell><p/><table/><p/></cell>,编译为既有 TableCell.blocks。有任一直接 p/table 子节点时进入块模式,块之间只允许结构性空白;文字、span、字段、图片等行内内容不得与块混合。原行内格保持原行为,空格仍是旧空行内格。不给无语义 blocks 包装层、CSS、URL 模板或任意动态执行增加入口。
格内首批只接受 p 与静态 table;不接受 heading、列表、if、each、rows、page-break、Note 或未知节点。根表计第一层,内表第二层,第三层在编译时拒绝。格内 p 保留独立 ID、ParagraphFormat、UTF-16、字段、图片及图文外链。cell 的字号/行距/对齐/禁则作为 p 的缺省文字格式,p 显式属性优先。内表的格缺省继续使用 XmlTemplate 既有 cellFormat,只有显式配置才改变。
块格所在父表的连通行组原子移页;含块格表 row-split=true、任何内表 row-split=true、重复表头中的块格在编译时拒绝。普通行内表头允许,内表自身静态合并沿用二维覆盖规则。首批不引入格内游标、拆分纵向组、第三层表或递归重复块表头。
外层 each/rows 可以复制完整块格。复用 DocumentTemplate 的深绑定及全树 ID:Each 的所有后代沿用确定后缀,Rows 后代使用既有每行命名空间。静态字段目标声明在当前词法复制范围时跟随副本重定位,外部目标保持原 ID;循环外引用原型不猜测某个副本。条件分支都参与源码验证,未产生的目标最终布局失败。XML 仍不支持动态字段 target。
编译器在返回模板前校验所有分支的深度、互斥内容、表格几何、属性与原子约束。共享源 AST 预算包含所有后代;绑定预算递归累计所有块、行、生成文字、字段目标后缀和访问工作。最终布局、字段、锚点、诊断、链接与 DOCX 继续使用既有语义树及 IR,不创建第二套绑定器、私有 DocumentEngine 或提前绘制内容。
没有公共生产签名、Node 形状、依赖、坐标或资源协议变化。JDK StAX 的 DTD/实体/命名空间/外联拒绝、显式图片注册、借用 Reader、取消恢复及安全源位置诊断保持。Markdown 不接收该 XML 语法。
替代方案与影响
把 p/table 拼成单段文字会丢失格式、ID 与书签归属。只开放标签而延迟非法树到运行时,会使未选分支逃过既有全分支检查。新增无语义包装层增加编写负担,不能消除混合内容验证。以上方案均不采用。
本批仅关闭安全声明式语法中与现有两层原子块模型一致的切面;GAP-07 的 HTML/CSS、include、多级编号、动态链接和设计器保持开放。PDF 与 Word 不保证同分页;XML 接受内容不扩大 DOCX 的严格往返子集。
验收
需要 XML/Java 对等树、静态/Each/Rows 深绑定、独立段格式、父子合并、最终页码/引用/编号/图文外链、层级来源、精确预算与取消测试。第三层、混合内容、非法几何、块表头、内外拆行和未知语法必须在未选分支也拒绝。新增 PDF 全页独立解析、双渲染及查看;标准 DOCX p/tbl/p、字段/媒体/书签与严格回读、隔离 Maven 调用方及历史模板/块格验收分别报告,不自动刷新视觉基线。