
第一次接手 S1000D 项目的人大概率会经历同一个场面规范文档下载下来几千页目录翻了半小时还是不知道明天该干什么。S1000D 这套东西的麻烦之处在于它不是一份照着填就行的表格模板而是一整套关于技术出版物怎么生产、怎么存储、怎么复用的方法论。它规定的是数据模块Data Module怎么切、怎么编码、怎么进公共源数据库CSDB、又怎么按不同机型、不同客户、不同语言组装成最终交付物。你如果按排版文档的思路去读它会越读越迷糊按数据库内容组件的思路去读脉络其实相当清楚。这套规范最早由欧洲航空工业界联合提出后来交给国际指导委员会维护目前工程里最常见的是 Issue 4.1、4.2新项目开始逐步切到 Issue 5.0。它的适用范围早就溢出了民用航空轨道交通、能源装备、大型工程机械、船舶的售后技术资料团队都在用。适合读这篇的人有三类正在被要求按 S1000D 交付的技术文档工程师、要给文档系统做底层数据结构的开发、以及需要评估这套东西到底值不值得上的技术负责人。下面我按实际落地的顺序把这份规范里真正影响你日常工作的部分拆开讲。1. 先搞清S1000D要治的病手册为什么会越写越乱1.1 传统手册的三个死结不做任何规范约束的技术手册写到第三个型号就一定会出问题而且问题高度雷同。第一个死结是重复。同一台设备的启动步骤操作手册里写一遍维护手册里写一遍培训教材里再写一遍客户定制的简版里还得写一遍。四份内容 90% 相同但只要改一次参数四份都得改漏掉一份就是现场事故。第二个死结是构型分叉。同一个产品卖给十个客户其中三个客户装了选装包 A两个装了选装包 B还有一个两个都装了。传统做法是出四个版本的手册或者在里面塞满如果装配了 XX 则……的条件句。前者导致版本爆炸后者导致可读性崩塌。第三个死结是输出格式绑死内容。内容写在一个 Word 文件里排版和文字混在一起。哪天领导说我们要做个能在平板上点的交互式手册你只能推倒重来——因为内容和样式根本没有分离抽不出来。1.2 S1000D给出的核心答案内容与呈现彻底分家S1000D 的全部设计都指向一件事把内容拆成有独立身份的小块让样式和组装逻辑在最后一刻才介入。具体来说它做了三个层面的切割。内容层面一个完整的操作步骤、一段原理描述、一张零件清单各自成为独立的数据模块每个模块有自己的唯一编码DMC。存储层面所有数据模块统一放进公共源数据库数据库不关心你最终要出 PDF 还是网页它只管存和管版本。呈现层面通过样式表把 XML 转换成 PDF、HTML 或交互式电子技术手册IETP通过发布模块决定这一次交付要挑哪些模块、按什么顺序拼。这么设计的好处很直接改了泵的拆卸步骤只需要改一个数据模块所有引用它的手册、教材、IETP 自动全部更新。同一套内容要出中文版和英文版只需要多一份语言标记不同的模块结构完全一致。这就是所谓的一次编写、多次输出。提示S1000D 的这套思路和软件工程里的组件化、单一数据源是一回事。你如果熟悉前端里数据驱动视图的概念理解起来会快很多。1.3 它不解决什么先划清边界新手最容易踩的认知坑是把 S1000D 当成一个排版工具或者一个软件产品。它不是。规范本身只规定内容该长什么样、该有哪些元数据、该遵守哪些约束它不提供编辑器不提供渲染引擎也不提供发布平台。这些东西要靠你选工具链、选内容管理系统CCMS来实现。另一个边界是S1000D 管的是内容的结构与生命周期不管你的业务规则本身对不对。比如拆卸液压泵前必须先泄压这条业务逻辑规范不会替你判断它只提供一个位置让你把这句话写进去并且保证它出现在所有该出现的地方。2. 数据模块编码拆解一串字符怎么把内容钉在位置上2.1 数据模块编码DMC为什么值得花时间去啃如果说 S1000D 里只能挑一个东西彻底搞懂我建议选 DMC。因为它决定了你整个内容库的骨架一旦编码方案定歪后期想改就是伤筋动骨。DMC 是一串字符把这是哪个型号的、哪个系统的、哪个部件的、干什么用的、装在什么位置这几个信息全部压进去。它的价值在于机器能靠它精确定位和检索内容人能靠它一眼判断这个模块属于谁。以 Issue 4.x 的通用结构为例DMC 由以下几段组成实际长度随版本和可选项变化务必以项目采用的版本为准段名含义典型长度说明MIC型号识别码2-4 位区分不同产品/项目SDC系统差异码1-4 位可选同型号的不同构型差异SNS标准编号系统可变系统/子系统/子子系统/装配件DC分解码2 位拆解层级DCV分解差异码1 位拆解层级的变体IC信息码3 位这个模块干什么用ILC项目位置码1 位内容对应的物理位置SNS 这一段是重点它借用了 ATA 章节编号的思路系统两位或三位数字、子系统两位、子子系统两位、装配件四位。比如21是液压系统、21-10是主液压系统下的某个子系统。你可以把它理解成图书馆的分类号只不过分类规则是你自己在业务规则里定死的。2.2 信息码IC决定了模块的动词很多人刚开始分不清这个内容该不该单独建模块其实看信息码就清楚了。信息码描述的是这个模块要完成的动作类型常见的有000功能描述、系统原理040操作程序比如开机、切换模式200维护作业的总体说明300检查、检验500拆装合并的作业520拆卸720安装800计划性维护900故障隔离与排故这里有个非常实用的判断标准同一个部件、同一个位置、不同的动作必须是不同的数据模块。拆泵和装泵虽然内容对称但它们是 520 和 720不能合并成一个模块因为使用者在现场只会需要其中一个。反过来同一个动作如果适用于多个位置就要考虑用适用性标注而不是复制模块。比如拧紧扭矩 25N·m这条要求适用于 12 个螺栓位置你不该建 12 个模块而应该建一个模块然后用适用性条件把 12 个位置圈进来。2.3 一个真实的数据模块XML长什么样光看字段表容易晕直接看结构最清楚。下面是一个操作程序类数据模块的骨架属性值和枚举以项目 BRDP 定义为准dmodule identAndStatusSection dmAddress dmIdent dmCode modelIdentCodeEXAB systemDiffCodeA systemCode21 subSystemCode1 subSubSystemCode0 assyCode00 disassyCode00 disassyCodeVariantA infoCode040 infoCodeVariantA itemLocationCodeA/ language languageIsoCodezh countryIsoCodeCN/ issueInfo issueNumber001 inWork00/ /dmIdent dmAddressItems issueDate year2025 month03 day12/ dmTitle techName主液压泵/techName infoName启动前检查/infoName /dmTitle /dmAddressItems /dmAddress dmStatus security securityClassification01/ responsiblePartnerCompany enterpriseCodeEXAB/ originator enterpriseCodeEXAB/ applic displayText simplePara适用于 2023 年之后交付的整机/simplePara /displayText /applic brexDmRef dmRef dmRefIdent dmCode modelIdentCodeEXAB systemDiffCodeA/ /dmRefIdent /dmRef /brexDmRef /dmStatus /identAndStatusSection content procedure preliminaryRqmts reqCondGroup reqCondpara设备已断电并挂牌/para/reqCond /reqCondGroup /preliminaryRqmts mainProcedure proceduralStep para打开泵体下方的观察窗盖板。/para /proceduralStep proceduralStep para确认油位处于标记线之间。/para /proceduralStep /mainProcedure closeRqmts reqCondGroup reqCondpara盖板复位并锁紧。/para/reqCond /reqCondGroup /closeRqmts /procedure /content /dmodule注意几个细节。identAndStatusSection是身份与状态区决定的模块是谁、谁负责、什么密级、适用于什么、遵守哪套规则content区才是真正的内容。preliminaryRqmts前置条件、mainProcedure主步骤、closeRqmts收尾条件这套结构S1000D 是强制的因为现场人员需要这三段分开看。这个强制结构看起来很啰嗦但恰恰是它比自由格式的 Word 文档值钱的地方——所有程序类模块结构一致做交互式呈现时可以直接按语义节点渲染不需要为每个手册单独适配。2.4 拆分粒度最容易吵架的地方数据模块到底该切多大这个问题我在三个项目上见过三次激烈争论答案从来不是靠直觉定的而是靠两条规则。第一条规则是复用边界。问自己这段内容会不会被别的模块引用会不会在不同交付物里以不同方式出现如果是它就该独立。一条通用的安全警告被几十个程序引用那就必须独立成模块否则改一次要动几十个地方。第二条规则是变更频率。两个内容块如果永远一起改切太细反而是负担。比如某个部件的安装步骤和它的扭矩表如果改一个必然改另一个那放同一个模块里更省事。实践中的经验区间是一个程序类数据模块的正文控制在 1 到 5 页渲染后超过就要考虑拆少于半页就要考虑合。纯描述类模块可以稍长零件清单类模块基本由数据量决定不用人为干预。注意拆分粒度一旦定下来后期调整的代价极高因为所有引用关系都要重算。建议在第一个型号上花两周时间做一次完整的拆分演练把最难的部分比如总装、排故真拆一遍再定标准。3. 公共源数据库里的四类账本DMRL、PM、BREX与适用性3.1 CSDB不是网盘它是带约束的内容仓库很多人以为把 XML 文件丢进一个文件夹就是 CSDB 了。差得远。真正的公共源数据库除了存数据模块还要维护数据模块之间的引用关系、版本状态、适用性映射、以及哪些模块属于哪次发布这套账。S1000D 把 CSDB 里的东西分成几类。数据模块是内容本体数据模块清单DMRL是这个项目一共有哪些模块的总账发布模块PM是这一次交付要出哪些模块、按什么顺序排的订单业务规则相关模块BREX是这个项目允许和禁止怎么写的语法约束。这几样东西配合起来才构成一个能自动运作的系统。3.2 DMRL与PM一次交付是怎么被点单出来的DMRL 的价值在于它是一份可审核的清单。客户拿到 DMRL能看到你承诺交付的每一个内容块、它的编码、版本、状态。这比拿到一本 800 页 PDF 要透明得多——PDF 里漏了一个章节你很难发现DMRL 里少一行编码机器立刻就能比对出来。PM 则是实际的组装单。它像一个播放列表按顺序列出要包含哪些数据模块还可以嵌套子 PM。同一个数据模块可以被多个 PM 引用这正是内容复用的落点。举个具体例子PM-操作手册引用 320 个数据模块PM-维护手册引用 780 个数据模块其中 140 个与操作手册共用PM-客户A定制版在维护手册基础上替换 22 个模块加 8 个改一个共用模块三本手册同时更新不需要人工同步。这就是前面说的一次编写、多次输出落到工程上的样子。3.3 BREX把业务规则写成机器能查的规则BREX 是我认为 S1000D 里被低估最严重的一块。它的作用是把你项目的编写规则用结构化方式表达出来让编辑器在写作时实时校验。举个最简单的场景你们项目规定所有警告必须放在步骤之前且必须包含后果描述。这个规则如果只写在 Word 版编写指南里三个月后没人记得审核时全靠人眼抽查。写成 BREX 之后作者在编辑器里写错位置系统当场报错根本提交不进 CSDB。BREX 能约束的东西包括哪些元素允许出现在哪些位置、哪些属性必填、枚举值的取值范围、标题的字数上限、必须引用的模块类型等等。这部分写起来前期投入不小大概需要一到两个人月但它是文档质量从靠人转向靠系统的分水岭。提示BREX 不要一次写完。先把最痛的十条规则写成 BREX跑通流程再逐步加。一上来追求全覆盖最后的结果通常是规则没写完、流程也停了。3.4 适用性一套内容适配多种构型的正确姿势适用性是 S1000D 区别于传统手册最锋利的一把刀。它的核心思路是内容只写一遍用条件标注说明它适用于哪些产品。实现上靠三张表配合产品交叉引用表PCT描述产品有哪些构型属性条件交叉引用表CCT描述条件怎么组合适用性交叉引用表ACT把每个数据模块或模块内的片段绑定到具体的适用性条件上。这套机制有个容易被忽略的细节适用性不只是模块级的也可以是片段级的。也就是说同一个步骤列表里第 3 步可以标仅适用于装了选装包 A 的机器第 4 步标仅适用于未装选装包 A 的机器。渲染的时候系统自动挑。这意味着你不需要为不同构型维护多套手册一套内容库就够了。代价是适用性体系设计得不好会变成一场灾难。我见过一个项目适用性条件嵌套了四层最后没有任何一个人能说清某个模块到底覆盖哪些机器只好推倒重做。经验做法是控制适用性属性的维度尽量扁平属性之间不要互相依赖。4. 从XML到能点的手册样式表、发布模块与IETP分级4.1 内容和样式的分界线到底划在哪XML 存的是结构不是外观。所以从数据模块到最终交付物中间必然有一层转换。S1000D 生态里的标准做法是用 XSLT 把数据模块转换成中间格式或 HTML用 XSL-FO 或排版引擎把内容转成分页的 PDF。关键点在于样式表不属于内容库。它是一套独立维护的资源负责把语义节点映射成视觉表现。warning渲染成红色边框还是黄色底纹是样式表的事warning表示强烈警示是内容的事。这两件事分开你才能在换一次交付格式时不重写内容。实际操作中一个项目通常要维护至少三套样式PDF 打印版、网页/移动端版、以及交互式手册版的渲染样式。它们在同一个 XML 源头上工作。4.2 IETP的分级别一上来就冲最高级交互式电子技术手册IETP在规范里按能力分成若干等级从最基础的线性浏览一直到能跟诊断系统联动的复杂形态。大致可以这样理解等级区间能力特征典型实现成本基础级目录导航、文本搜索、页面线性浏览低接近电子书中级结构化导航、零部件交互、图形热点、适用性过滤中需前端开发高级排故流程引导、与外部系统数据联动、用户操作记录高需系统集成我的建议非常明确第一个项目直接做中级。基础级体现不出 S1000D 的结构优势高级又需要大量系统对接和现场验证风险太高。中级方案里适用性过滤、零件信息交互、图形热点这三样做出来业务方基本就能看到价值了。4.3 两个最值得先做的交互功能如果只能做两个交互功能我选适用性过滤和故障隔离引导。适用性过滤的价值在于它直接减少现场翻页量。操作员在系统里选一次自己的机器构型整本手册自动只显示相关步骤。这个功能做出来之后我见过现场人员的使用意愿明显上升——因为以前他们要在如果装了 A 则……否则……这类句式里自己找答案现在答案已经被筛出来了。故障隔离引导的价值在于它把观察到的现象和排故步骤连起来。使用者描述现象系统按故障隔离类数据模块的判定逻辑逐步走每一步给出通过/不通过的分支。这里的实现要点是故障隔离模块里的判定逻辑必须在 XML 结构上表达清楚不能写成一大段自然语言否则前端的引导根本抽不出来。这也是为什么前面强调数据模块结构要严格——结构不严交互功能就没有基础。5. 落地路线小团队怎么在三个月内跑通第一个闭环5.1 工具链怎么选别一步到位工具选型的关键词是够用就好。做 XML 内容第一件需要的工具是一个靠谱的 XML 编辑器能支持 Schema 校验和 XPath 查询基本就够开工了。第二件是版本管理和差异比对能力内容库和代码库一样没有版本管理就是灾难。至于内容管理系统CCMS我的建议是第一个项目不要买重型 CCMS。先用文件系统加分版本管理工具加一套自己写的校验脚本把流程跑通。等你真的知道自己在哪些环节痛了——是检索慢、还是审核流复杂、还是多人协同冲突多——再针对性地上系统。反过来先上系统再找需求你会把大量时间花在配置上内容反而写不出来。发布环节可以先用 XSLT 加开源排版引擎搭一个最小可用链路数据模块加 PM通过样式表输出 PDF。这条链路搭起来大概需要两到三周但一旦跑通后面加输出格式就只是加样式表的事。5.2 角色怎么分工一个最小可运转的团队需要这么几个角色人少的话可以兼任但职责必须明确业务规则负责人定 SNS 编号方案、信息码使用范围、BREX 规则这个人对内容库的结构负责通常是资深技术文档工程师。内容作者写数据模块不需要懂 XML 的深层机制但必须理解拆分逻辑。技术实现搭校验脚本、样式表、发布链路。构型数据管理维护适用性相关的那几张表这个角色最容易被忽略但一旦缺失后期会出现大量这个模块到底适用于哪些机器的糊涂账。5.3 三个月的推进节奏第一个月做设计确定 SNS 编号方案选一个中等复杂度的系统不要选最简单的也不要选整机把它完整拆成数据模块产出 DMC 清单草案。同时搭好 XML 编辑和校验环境。第二个月做闭环把选定的系统写完整跑通从数据模块到 PDF 的发布链路中间加入 BREX 校验。这个月结束的标准是能拿一份自动生成的、内容正确的 PDF 出来。第三个月做扩展加第二个系统验证复用是否真的有效加适用性标注验证过滤是否工作再试着输出一个网页版本验证样式表的可替换性。这个月结束团队对 S1000D 的理解就不再是纸面上的了。注意不要在第一个项目上追求完整覆盖。挑一个系统跑通全流程胜过把十个系统都拆成半成品。半成品的模块库比没有模块库更难收拾。6. 真正会让人翻车的六个现场问题6.1 把规范当成排版模板先定样式再定结构这是最常见也最致命的一个。团队拿到规范第一反应是我们要做成什么样于是先讨论字体、颜色、页面布局然后反推结构。结果是把内容硬塞进预设的外观里很多 S1000D 的语义节点用不上交互功能也无从实现。正确的顺序是反过来的先把内容结构定清楚再考虑渲染。判断标准很简单——如果同一份内容明天要换一个完全不同的交付形式你的数据模块需不需要改需要改说明结构和样式还没分开。6.2 模块粒度失控的两个极端一个是切得太粗一个模块里塞了整台设备的操作编码里那个分解码完全失去意义复用无从谈起。另一个是切得太细一句话一个模块结果一个操作流程要引用三十个模块维护成本爆炸。这个问题没有一劳永逸的答案但有个可操作的诊断方法统计一下你的模块被复用次数。如果一个模块被引用次数是 1且预计永远不会被第二次引用那它的拆分大概率过度了如果一个模块被引用的地方超过二十处改一次要回归验证二十处那就要考虑是不是该把其中的可变部分再拆出来。6.3 BREX写完没人用很多项目把 BREX 当成一份规范性文件写写完就归档编辑器根本没配校验。这样 BREX 的价值是零。BREX 必须绑定到写作工具里作者每保存一次就校验一次报错不通过就提交不了。做不到这一点就别花时间写 BREX不如把规则写得再短一点、更聚焦一点。6.4 忽视版本升级带来的连锁反应S1000D 每隔几年出一个新版本Schema 会变元素和属性会调整。如果你在 Issue 4.2 上建了几千个数据模块然后想升到 Issue 5.0那是一次实打实的迁移工程。所以选版本这件事要在项目启动时就定死并且想清楚未来三到五年会不会需要升级。如果会前期就要在工具链里预留转换能力别把版本号硬编码到各种脚本里。6.5 中文语境下的语言标记与翻译流程英文项目里这个问题不明显中文项目里它一定会冒出来。S1000D 用语言标识区分同一内容的不同语言版本中文场景下要特别注意简繁体、地区变体的标记方式以及术语表的建立。我的实际体会是中英双语的模块不要用两个独立的 DMC而要用同一个 DMC 加不同的语言标识。这样两者天然绑定一方更新另一方会被标记出来需要同步。如果建成两个 DMC时间一长必然出现内容漂移最后没人说得清哪个是准的。6.6 把IETP当成PDF转换器最后一个坑很隐蔽。有些团队做完 PDF 发布觉得 IETP 就是再加一个输出格式于是直接拿 PDF 渲染的样式表去生成网页。结果出来的东西虽然能在浏览器里看但没有任何交互能力——不能按构型过滤不能跳转零件不能走排故流程。IETP 的本质不是格式转换而是语义节点到交互行为的映射。你在设计数据模块结构的时候就要为未来的交互留出语义钩子。比如排故步骤里的判定分支必须在 XML 里显式标出判定条件而不是写在一段话里。这个决定必须提前做事后补是补不回来的。我在几个项目上反复验证过一件事S1000D 的投入回报不是线性的。前半年你会觉得它比写 Word 麻烦得多写一个模块要填一堆元数据还要过校验。但从第二个型号开始当你要复用上一代内容、要同时出四个客户的定制版本、要在一个月内响应一次设计变更的时候差距会突然拉开——传统模式要重写的内容这边可能只改几个模块就完成了。真正的门槛从来不在 XML 语法而在于你愿不愿意在前期把编号方案、拆分粒度和适用性体系这三件事想清楚。这三件事想清楚了后面都是体力活想不清楚后面全是技术债。