验证两个XML文档之间的链接

时间:2013-04-25 22:02:05

标签: xml xsd xml-validation

我对构建和验证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编辑器,例如oxygenXML,并且能够创作(从模式生成)并让编辑器帮助他们只输入有效的主题/子主题组合。

这甚至可能吗?

我一直在摸不着头脑,如果你有的话,我会非常欣赏一些智慧的话语。

2 个答案:

答案 0 :(得分:1)

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

将此类验证集成到创作工具中,我们认为具有挑战性。

答案 1 :(得分:1)

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

无所作为的两种替代方法(或使用图灵完整语言的程序进行验证)是

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

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