gpt4 book ai didi

xml - XSD:允许任何未知元素以任何顺序

转载 作者:行者123 更新时间:2023-12-03 20:20:18 24 4
gpt4 key购买 nike

我需要编写一个 XSD 架构。在这个模式中,一些元素是已知的和强制性的,其他元素是未知的和可选的:

<father>
<childMandatory1 />
<childMandatory2 />
<childOptionnal1 />
</father>

或:(更改强制性 child 订单)
<father>
<childMandatory2 />
<childMandatory1 />
</father>

我知道强制性的 child (但不知道他们的顺序)。但我不知道是否会有任何可选的 child (人)(如果有,他们的名字)。

我尝试使用 "xs:all",但 "xs:all"不允许 "any":
<xs:element name="father">
<xs:complexType>
<xs:all>
<xs:element ref="childMandatory1" />
<xs:element ref="childMandatory2" />
<xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
<!-- error here ! -->
</xs:all>
</xs:complexType>
</xs:element>

我尝试了序列,但我应该知道元素的顺序。 (我没有)

我尝试了选择,但选择不能与任何和某些强制性元素一起使用。 (并且我想确保存在强制性元素)

最佳答案

根据您的要求,您已经达到了唯一粒子属性规则,该规则非常重要,以至于 it has its own Wikipedia page .

问题在于将任何顺序与任何地方的任何元素组合在一起。处理器无法确定某个元素属于哪个声明。是否childMandatory1属于xs:any还是属于元素声明?

一旦您使用 xs:any你很容易遇到这个问题。这就是为什么允许序列与 xs:any 组合的原因。 ,但前提是序列中的项目是强制性的并且是有序的,否则再次不知道哪个元素属于哪个声明。

如果您创建此类 XSD 的原因是为了验证输入是否存在某些元素,您可以切换到 XSD 1.1,您可以使用 xs:assert 解决此问题。 ,或者您可以使用不同的工具,如 RelaxNg 或 Schematron,它们是替代的标准化 XML 模式语言。

如果你想从中创建一个对象模型,你可能会走运,因为即使你设法这样做,(反)序列化器也无法告诉彼此的声明。

这是 XSD 1.1 中的一个示例:

<xs:complexType name="BookType">
<xs:all>
<xs:any maxOccurs="unbounded" namespace="##any" />
</xs:all>
<xs:assert test="self::author | self::title | self:isbn" xpathDefaultNamespace="urn:test" />
</xs:complexType>

一篇关于 writing extensible XSD Schema's using Variable Content Containers 的好文章和有用的文章可以在 XFront 上找到。虽然很老,但它今天仍然非常适用。还有一个 article on the use of xs:any .

关于xml - XSD:允许任何未知元素以任何顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32741978/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com