0

我对构建和验证 XML 文档的具体细节非常陌生,所以我希望我问的是一个微不足道的问题。

我有一个文档中描述的主题和子主题的层次结构:

<topics>
  <topic> <name>First Topic</name>
     <subtopic> <name> Subtopic 1 </name> </subtopic>
     <subtopic> <name> Subtopic 2 </name> </subtopic>
  </topic>
  <topic> <name>Second Topic</name>
     <subtopic> <name> Subtopic 3 </name> </subtopic>
     <subtopic> <name> Subtopic 4 </name> </subtopic>
  </topic>
</topics>

另一个包含主题和子主题的文档:

<mydoc>
   <topic>First Topic</topic>
   <subtopic>Subtopic 1</subtopic>
   ... rest of the doc ...
</mydoc>

我想确保仅包含有效的主题/副主题组合,并且易于验证。我不确定这样做的方法应该是什么。

我首先认为我可以在模式中定义复杂类型以概述可能的组合,但前几个这样做产生了我无法完全理解的重言式。

我的第二个想法就像我上面指出的那样;将主题/子主题放在单独的文档中,也许给每个子主题一个唯一的“id”属性。然后我可以改用类似的东西:

<mydoc subtopic_id="st4"> ... </mydoc>

然后我可以验证 mydoc 仅包含文档中存在的 subtopic_ids。但是,我一直在摸索以了解如何验证这一点。而且,这意味着我必须创建一个需要被作者记住的 id 键。

那么,规范的方法是什么?

理想情况下,我希望有人使用 XML 编辑器,比如oxyXML,并且能够创作一个(从模式生成)并让编辑器帮助他们只输入有效的主题/子主题组合。

这甚至可能吗?

我已经为此挠头了一段时间,如果你有任何智慧的话,我将非常感激。

4

2 回答 2

1

XML Schema 不是为验证跨文档关系而设计的。一种方法是构建单个超级文档并对其应用 XSD 验证;但是,当文档无效时,所有依赖于验证前预处理的方法都难以产生良好的诊断。因此,我建议使用自定义 XSLT 样式表进行验证。

容我们说,将这种验证集成到创作工具中看起来具有挑战性。

于 2013-04-25T22:57:03.067 回答
1

正如 Michael Kay 所说,您的用例不是 XSD 旨在支持的。

什么都不做(或使用图灵完备语言中的程序进行验证)的两种替代方法是

  • Schematron,它允许您使用 XPath 的全部功能(或另一种查询语言 - 细节因实现而异)对文档进行断言,这可以被视为编写自定义 XSLT 样式表 MK 建议的一种简单方法

  • SML(服务建模语言),一个鲜为人知的 W3C 规范,可以被认为是为 XSD 提供扩展以支持跨文档验证

于 2013-04-26T18:05:19.590 回答