为什么 Dita 的架构分为主题和地图?

Why is Dita's schema split into topic's and map's?

我是 Dita 的新手,所以对于任何无知,我深表歉意。

我正在使用 XJC 将基础(且仅是基础)Dita 1.3 模式编译成 Java 类。当我试图编译所有 XSD 文件时,我收到错误,元素和组被重新定义。 None 我尝试编写的 XJC 绑定会修复它。

深入研究架构后,我发现 mapGrp.xsd/mapMod.xsd 和 topicGrp.xsd/topicMod.xsd 包含相同的组和元素定义。这解释了为什么 XJC 在包含所有 XSD 文件时会失败。 XSD 解析器本身无法处理这些重复条目。

所以我分别生成了 basemap.xsd 和 basetopic.xsd 并清理了生成的代码,这样我就可以 运行 对这两个目录进行比较。

我发现这两个模式有一些特定于地图和主题的元素。例如,映射架构具有 DitavalmetaClass 和 DvrKeyscopePrefixClass,而主题架构则没有。主题模式包含 AbstractClass 和 BodyClass,而地图模式不包含。但是大多数 类 由两个模式共享。

至于共享的 类,只有三个在两个架构之间存在一些差异(LinktextClass、MetadataClass 和 SearchtitleClass)。即便如此,它们也不是很大的变化,只是它们可以包含的内容有所不同。

我的问题是,为什么共享的 类 不能在主题和地图之间共享的一个公共 Grp/Mod 模式下重新定义这三个 类?我可以更改这两个模式,以便它们共享相同的元素和组,而不破坏任何其他扩展基本模式的模式吗?

DITA 1.3 XML 不再手动组合模式。它们是从 Relax NG 模式自动生成的,这些模式是规范正式支持的模式。也许您还应该看看 DITA 1.2 XML 模式,它们是手动编写的,它们可能会更好地建模以重用更多元素定义。

地图和主题是两种不同的文档类型。它们共享一些共同的元素类型,但在其他方面是完全独立的文档类型。

另请注意,DITA 没有 "a single grammar" 其他 XML 应用程序(或看起来)的方式。

DITA 的明确架构允许从基本语法进行受控扩展,因此您可以执行以下任何操作:

  • 配置给定的地图或主题类型以包含或排除特定元素,其他主题类型(在主题的情况下)或特定元素 "domains"("mix-in" 元素集)。因此,"topic" 文档可以有两种不同的工作语法,允许不同的元素集。
  • 添加 "constraint" 以某种方式限制现有内容模型或属性列表的模块(例如,禁止在特定上下文中使用基本元素类型)。
  • 通过"specialization"
  • 定义您自己的新元素类型和属性

因此,在一般情况下,任何以任何静态方式为 DITA 生成 Java classes 或数据库模式的尝试都注定要失败。

如果您正在实现需要对任何符合标准的 DITA 文档进行操作的代码,那么它需要更加灵活,并根据元素的 @class 值而不是标签名称对元素进行操作。

如果您从 XSD 生成 Java classes 是明智的,您必须处理每个顶级地图和主题类型(地图、书图、主题方案、学习地图、主题、概念, task, general-task, reference, glossentry, 等等)作为一个不同的 class 层次结构——你不能将它们组合在一个单一的层次结构中,因为它们对相同的元素类型有不同的内容模型规则。

您绝对应该阅读 DITA 架构规范:

http://docs.oasis-open.org/dita/v1.2/os/spec/architectural_specification.html#architectural_specification

干杯,

艾略特