xsd - 为什么 Dita 的架构分为主题和 map ?

标签 xsd jaxb dita

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

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

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

因此,我分别生成了 basemap.xsd 和 basetopic.xsd,并清理了生成的代码,以便我可以对这两个目录运行差异。

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

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

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

最佳答案

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

另请注意,DITA 不像其他 XML 应用程序那样(或看起来那样)具有“单一语法”。

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

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

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

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

如果您从 XSD 生成 Java 类是明智的,您必须处理每个顶级 map 和主题类型( map 、书图、主题方案、learningMap、主题、概念、任务、一般任务、引用、glossentry、等)作为一个不同的类层次结构——您不能将它们组合在一个层次结构中,因为它们对于相同的元素类型将具有不同的内容模型规则。

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

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

干杯,

艾略特

关于xsd - 为什么 Dita 的架构分为主题和 map ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35185312/

相关文章:

java - 在 Android 中将 XML 文件解码为 Java 对象?

xsd - 为什么有些模式使用 <xsd :choice> instead of <xsd:enumeration>?

java - 解析 xsd 以使用 JAXB 生成类时出现 NoSuchMethodError

xslt - "<xsl:call-template name="commonattributes"/>"是什么意思以及如何使用?

python - 从文档字符串生成 DITA xml

java - 属性 'xsi:noNamespaceSchemaLocation' 不允许出现在元素 'VAST' 中

解码 XML 时发生 javax.xml.bind.UnmarshalException

java - 为什么 wsimport 在处理具有 @XmlRootElement 注释的服务器对象时遇到问题?

java - JAXB 2.0 - 如何跳过节点处理并将它们作为字符串返回

XSLT 匹配节点不是值