4

我有一个如下所示的 XML:

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

我正在寻找一种方法来强制s 中Artifact包含的元素数量Artifact应等于使用 XSD 模式的“count”属性的值。

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


编辑:为了更准确,我将尝试为问题提供更多背景信息。
XML 文件将作为输入提供给 C++ 应用程序。问题是开发环境强制使用 Xerces v. 2.8.0 库进行解析。据我了解,此版本不支持 XSD 1.1 标准。

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

4

2 回答 2

2

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

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

/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属性做了非常相似的事情。

于 2015-04-01T11:32:26.457 回答
1

我会假设计数值是动态的,基于 Artifact 元素的实际数量。一种方法(因为我不知道您的上下文是什么)可能是根据此值使用 minOccurs 和 maxOccurs 修改 XSD,然后针对新架构进行验证...

<xsd:complexType name="Artifacts">
    <xsd:sequence>
      <xsd:element name="Artifact" minOccurs="COUNT_VALUE" maxOccurs="COUNT_VALUE" />      
    </xsd:sequence>   
</xsd:complexType>
于 2015-04-01T11:33:18.930 回答