当前位置 : 主页 > 网页制作 > xml >

xml – 根据属性值限制元素的出现次数

来源:互联网 收集:自由互联 发布时间:2021-06-13
我有一个看起来像这样的 XML: Artifacts count="2" Artifact ... /Artifact Artifact ... /Artifact /Artifacts 我正在寻找一种方法来强制使用XSD架构,Artifacts中包含的Artifact元素的数量应该等于“count”属性
我有一个看起来像这样的 XML:

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

我正在寻找一种方法来强制使用XSD架构,Artifacts中包含的Artifact元素的数量应该等于“count”属性的值.

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

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

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

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

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

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

The XML file will be provided as input to a C++ application. The problem is that the development environment enforces the usage of the Xerces v. 2.8.0 library for parsing. To my understanding this version does not support the XSD 1.1 standard.

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

Of course, I can add extra code in order to check for the correct number of occurrences of “Artifact” elements after the XSD validation. I was hoping that there would be a way to avoid the extra code segment and completely validate the input file based on the XSD alone.

不,只有XSD 1.0你无法避免那些额外的代码行.

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

This is correct, and I would also challenge OP’s design that requires an attribute that merely mirrors the number of child attributes.

从XML设计的角度来看,如果这个属性除了说明有多少个Artifact元素之外别无其他,那你为什么要首先包含它呢?您应始终不愿意存储冗余和可恢复的信息.例如,不需要存储子元素的位置,如下所示:

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

而你的count属性做的非常相似.

网友评论