【问题标题】:XSD: Allow any unknown element in any orderXSD:允许任何顺序的任何未知元素
【发布时间】:2015-09-23 14:12:17
【问题描述】:

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

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

或:(更改强制子订单)

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

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

我尝试使用“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>

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

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

【问题讨论】:

  • 也许你应该在xs:choice里面使用xs:any
  • @AlexanderPetrov,这也将违反UPA principle

标签: xml xsd


【解决方案1】:

根据您的要求,您已经达到了唯一粒子归属规则,这对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>

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

【讨论】:

  • 好吧,我不这么认为,但这是有道理的!感谢您提供有关 UPA 的信息。我需要一个模式来验证 xml,但主要是为了访问强制元素(使用 jaxb 对象)。我可以尝试使用 xsd 1.1 来验证 xml,然后使用 xPath(而不是 jaxb 对象)来读取和使用数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-30
  • 1970-01-01
相关资源
最近更新 更多