我是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模式下重新定义这三个类?我是否可以更改这两个模式,以便它们共享相同的元素和组,而不会破坏任何扩展基础模式的其他模式?
答案 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架构规范:
干杯,
埃利奥特