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

时间:2016-02-03 18:53:45

标签: xsd jaxb dita

我是Dita的新手,所以我为任何无知而道歉。

我正在使用XJC将基础(并且只有基础)Dita 1.3模式编译为Java类。当我尝试编译所有XSD文件时,我收到了重新定义元素和组的错误。我尝试编写的XJC绑定都没有修复它。

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

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

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

对于共享的类,只有三个在两个模式(LinktextClass,MetadataClass和SearchtitleClass)之间存在一些差异。即便如此,它们并没有太大的变化,只是它们可以包含的一些差异。

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

另请注意,DITA没有"单一语法"以其他XML应用程序的方式(或似乎如此)。

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

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

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

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

如果你有兴趣从XSD生成Java类,你必须处理每个顶级地图和主题类型(地图,书籍图,subjectScheme,learningMap,主题,概念,任务,一般任务,参考,glossentry,作为一个独特的类层次结构 - 您不能将它们组合在一个层次结构中,因为它们对于相同的元素类型将具有不同的内容模型规则。

您一定要阅读DITA架构规范:

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

干杯,

埃利奥特