4. 知情同意文档的结构化建模

知情同意书(ICF)在传统工作流中通常是一份 Word 文档,研究者、伦理委员会、申办方和受试者看到的是同一份“平面文本”。但在电子知情同意(eConsent)系统中,这份文本必须被拆解为可计算、可复用、可追溯的结构化对象,才能支撑多语言、多版本、多中心、多终端的动态渲染。本节的核心任务,就是建立一套 ICF 文档对象模型(Document Object Model,DOM),把“一段话”变成“一棵树 + 一组规则”。

一、从平面文本到四层结构

结构化建模的第一步是确定拆解粒度。ICF 文本可以按四个层次组织:章节(Section)、条目(Item)、变量(Variable)和逻辑规则(Rule)。章节对应“研究目的”“试验流程”“风险与获益”“隐私与数据保护”等大块内容;条目是章节内可独立渲染、独立签署或独立版本化的最小语义单元,例如“第 3.2 条:您需要进行的访视安排”;变量是条目中随受试者、中心、版本或语言变化而替换的占位内容,例如受试者姓名、中心编号、访视日期、补偿金额;逻辑规则则描述条目之间的显示、跳转、必填和签署依赖关系。

这四层不是简单的嵌套,而是“内容—数据—行为”的分离:章节和条目承载内容,变量承载数据,规则承载行为。只有分离清楚,才能做到同一份 ICF 在中文、英文、西班牙文下渲染出不同文本,却共享同一套变量和规则。

二、文档对象模型的设计

一个可版本化、可本地化、可动态渲染的 ICF DOM,通常包含以下核心对象:

  • Document:文档根对象,持有 documentId、studyId、版本号、生效日期、语言列表和默认语言。
  • Section:章节对象,持有 sectionId、标题、顺序号、可选性(是否必须展示)。
  • Item:条目对象,持有 itemId、所属 sectionId、内容模板、变量引用列表、签署要求、版本标签。
  • Variable:变量对象,持有 variableId、数据类型(文本/日期/数值/枚举)、来源(受试者/中心/系统)、默认值、是否可编辑。
  • Rule:规则对象,持有 ruleId、触发条件、目标 itemId、动作(显示/隐藏/必填/禁用/跳转)。
  • Localization:本地化对象,持有 languageCode、itemId、翻译文本、翻译状态(草稿/已审/已发布)。

这些对象之间通过 ID 引用,而不是通过文本位置引用。这样当某个条目被翻译成另一种语言时,规则和变量引用不会断裂;当某个章节被替换时,其他章节不受影响。

三、变量与规则的表达

变量在条目模板中以占位符形式出现,例如:

您将于 {{visitDate}} 到 {{siteName}} 进行第 {{visitNumber}} 次访视,
预计耗时 {{visitDuration}} 分钟。

渲染时,系统根据当前受试者上下文解析变量:visitDate 来自访视计划,siteName 来自中心主数据,visitNumber 来自方案配置,visitDuration 来自条目元数据。变量解析失败时,应触发“缺失变量”告警,而不是静默渲染为空字符串。

规则则用条件表达式描述。例如,当受试者为未成年人时,必须显示“法定代理人同意”条目,并要求其独立签署:

IF subject.age < 18
THEN SHOW item("guardian_consent")
     REQUIRE SIGNATURE BY "legal_guardian"
     SET item("subject_assent").required = true

规则引擎在渲染前对整棵文档树求值,决定每个条目的最终可见性和签署要求。规则求值结果应记录在渲染日志中,以便稽查时还原“当时为什么显示这一条”。

四、版本化与本地化的协同

版本化不是简单地把整份文档存成 v1、v2,而是对章节、条目、变量和规则分别打版本标签。当伦理委员会批准 ICF 修订时,通常只有部分条目发生变化。系统应支持“条目级差异比对”,明确列出新增、修改、删除的条目,并只要求受试者对变更部分重新签署。

本地化则与版本化解耦:一个条目可以有多个语言版本,但共享同一个 itemId 和同一套规则。翻译状态独立管理,只有“已发布”的翻译才能进入正式渲染。若某语言缺少某条目的翻译,系统应回退到默认语言并标记“回退渲染”,供监查员核查。

ICF 文档对象模型:内容—数据—行为分离 Document documentId · studyId · version · languages Section 1 研究目的 · 顺序 1 Section 2 试验流程 · 顺序 2 Section 3 风险与获益 · 顺序 3 Section N 隐私保护 Item 2.1 访视安排 · 需签署 Item 2.2 样本采集 · 需签署 Item 2.3 补偿说明 · 无需签署 Variable: visitDate 日期 · 来源:访视计划 Variable: siteName 文本 · 来源:中心主数据 Variable: visitNumber 数值 · 来源:方案配置 Rule Engine IF subject.age < 18 THEN SHOW guardian_consent · REQUIRE SIGNATURE BY legal_guardian · SET subject_assent.required = true 规则求值结果写入渲染日志,支持稽查还原 Localization zh-CN · 已发布 en-US · 已发布 es-ES · 草稿 ja-JP · 缺失 缺失时回退默认语言

五、动态渲染与稽查闭环

渲染引擎的工作顺序是:加载 Document → 解析 Section 顺序 → 对每个 Item 求值 Rule → 解析 Variable → 选择 Localization → 输出最终文本和签署控件。每一步都应产生可审计的记录。例如,当受试者年龄为 16 岁时,系统显示“法定代理人同意”条目,并在日志中记录 ruleId、触发条件、求值时间和结果。稽查员可以据此还原“为什么这位受试者看到了这一条”。

一个可直接参考的条目级配置示例如下:

{
  "itemId": "item_2_1",
  "sectionId": "section_2",
  "template": "您将于 {{visitDate}} 到 {{siteName}} 进行第 {{visitNumber}} 次访视。",
  "variables": ["visitDate", "siteName", "visitNumber"],
  "signatureRequired": true,
  "version": "2.1",
  "localizations": {
    "zh-CN": "您将于 {{visitDate}} 到 {{siteName}} 进行第 {{visitNumber}} 次访视。",
    "en-US": "You will visit {{siteName}} on {{visitDate}} for visit {{visitNumber}}."
  }
}

结构化建模的价值在于:当方案修订、语言增加或中心变更时,系统只需修改对应对象,而不必重排整份文档。ICF 从“一份文件”变成“一棵可计算的对象树”,eConsent 才真正具备工程化的可维护性。