2015-04-01 210 views
3

我有一个看起来像这样的XML:我正在寻找一种方式来强制执行包含在Artifact小号Artifact元素的数量限制数量

<Artifacts count="2"> 
    <Artifact> 
    ... 
    </Artifact> 
    <Artifact> 
    ... 
    </Artifact> 
</Artifacts> 

应通过使用XSD模式等于“count”属性的值。

尽管我找到了通过使用XSD 1.1规范来实现这一目标的可能方法,但我想知道如果没有它,即基于XSD 1.0规范,它是否完全有可能。


编辑:我会尝试提供一个更多的问题的上下文,以便更加精确。
XML文件将作为输入提供给C++应用程序。问题在于开发环境强制使用Xerces v。2.8.0库进行分析。据我了解,这个版本不支持XSD 1.1标准。

当然,我可以添加额外的代码,以便在XSD验证后检查Artifact元素的正确出现次数。我希望有一种方法可以避免额外的代码段,并完全验证基于XSD的输入文件。

回答

2

您想要建模的约束类型的正确术语是声明。不,XML Schema 1.0中不可能存在断言。支持断言的唯一验证语言是XML Schema 1.1(xs:assert)和Schematron(sch:assertsch:report)。

除此之外,你可以写正确的数量Artifact元素测试XPath表达式或XSLT样式表:

/Artifacts/@count = count(/Artifacts/Artifact) 

的XML文件将被作为输入提供给C++应用程序。问题在于开发环境强制使用Xerces v。2.8.0库进行分析。据我了解,这个版本不支持XSD 1.1标准。

我的猜测是,Xerces的2.8.0(过时的版本,不再支持)不符合XSD 1.1,但要找出最简单的方法是简单地测试它。在模式中包含任何xs:assert并查看会发生什么。

当然,我可以添加额外的代码,以便在XSD验证后检查“Artifact”元素的出现次数。我希望有一种方法可以避免额外的代码段,并完全验证基于XSD的输入文件。

不,只有XSD 1.0你不能避免这些额外的代码行。


编辑在评论中写道什么@kjhughes实际上应该是答案的一部分:

这是正确的,我也将挑战OP的设计要求,仅仅反映了一个属性子属性的数量。

从XML设计的角度来看,如果这个属性除了说明有多少个Artifact元素,其他什么都没有,为什么你把它包含在第一位呢?您应该始终不愿意存储冗余信息和可恢复的信息。举例来说,有没有需要存储的子元素的位置,像这样:

<root> 
    <child n="1"/> 
    <child n="2"/> 
</root> 

而且你count属性做一些非常相似。

+0

谢谢您的答复。我希望能有一种方法来操纵模式来做我的出价,但似乎没有。 我会给它更多的时间来看看是否有其他用户提出的任何疯狂的想法,否则这个答案是伟大的和正确的!与此同时,我正在创建具有此限制的模式,并且正在研究如何合并XLST和XPath。 – Vag 2015-04-01 12:29:46

+0

这是正确的,我也会挑战OP的设计,这需要一个仅反映子属性数量的属性。 – kjhughes 2015-04-01 14:32:44

+0

@kjhughes好点,我试图编辑这个到我的答案 - 让我知道,如果它仍然需要改进。 – 2015-04-01 14:41:19

1

我假设计数值是基于实际元素的实际数量的动态值。一种方法(因为我不知道什么是你的上下文中)可以修改与此值根据的minOccurs和maxOccurs的XSD,然后再次验证新模式......

<xsd:complexType name="Artifacts"> 
    <xsd:sequence> 
     <xsd:element name="Artifact" minOccurs="COUNT_VALUE" maxOccurs="COUNT_VALUE" />  
    </xsd:sequence> 
</xsd:complexType> 
+0

'minOccurs'的值必须是0或正整数,“COUNT_VALUE”将不起作用。 – 2015-04-01 11:40:07

+0

你是对的@Mathias关于minOccurs!为什么将maxOccurs设置为与解析输入xml中的count属性相同的值,保存到新的模式,并针对新的模式进行验证将无法工作? – exoddus 2015-04-01 11:44:28

+0

是的,这是可行的,但这是很多体力劳动,你不觉得吗?每次你想验证一个文档,你都必须改变模式。在我看来,模式的要点是_automatic_ validation,而不需要人为干预。 – 2015-04-01 11:47:45