3

我正在创建一个 XML 模式来描述来自各种来源的 XML 聚合。这些来源有各种/未知的元素名称,但我想验证一个已知的、常见的子元素。

例如:

<foo>
    <common bar="bar" />
</foo>

<baz>
    <common bar="bar" />
</baz>  

我想common用必需的参数来描述元素bar,但不知道父元素的名称(foobaz示例中,但实际上可能是任何东西)

我有以下内容,但不知道如何common在任何元素中强制执行元素。

<xs:complexType name="vendor">
    <xs:sequence>
        <xs:any namespace="##any" minOccurs="1" maxOccurs="unbounded" />
    </xs:sequence>
</xs:complexType>

W3C 文档告诉我你不能在xs:sequence标签内放置xs:any标签,所以我不知道如何继续。

4

2 回答 2

2

在一般情况下,这在 XSD 1.0 中是无法实现的。也就是说,除非: - 公共元素始终是第一个元素,在这种情况下,您首先设置该元素,然后根据需要在其后添加 xsd:any - 公共元素位于可以相对于命名空间子句单独列出的命名空间中考虑到您的命名空间,可以使用 xsd:any 表达,在这种情况下,您可以在此类强制common实例之前和之后使用任意数量的 xsd:any 。

或者,如果您保留 minOccurs=1,将 processContents 设置为 lax,并确保架构common在验证期间对 XSD 处理器可用,那么至少可以保证,如果common发生,它是有效的。不幸的是,您不能保证它至少会出现一次。

如果以上都不适合您,那么您可以轻松地为您的 XSD 1.0 定义一个 Schematron 附件;如果您负担得起 XSLT 运行,这应该可以工作。

最后,如果 XSD 1.1 是一个选项,一个简单的断言将完全满足您的需要。问题是 XSD 1.1 在支持方面仍处于起步阶段。

于 2013-11-07T15:09:59.150 回答
0

首先,定义一个声明公共元素的模式common

然后,在文档中的元素上调用架构验证器common,而不是在文档的最外层元素上。仅当您的验证器允许您说出从哪里开始验证时,这才有效;大多数通过 API 提供的验证器都可以做到这一点,但许多命令行界面不支持它(也许应该,但他们不支持)。

或者,在“宽松通配符模式”中调用最外层文档元素的模式验证器;这是(据我所知)命令行界面最常见的默认调用模式。仅当您的验证器通过下降到与通配符匹配的元素的子元素(然后是孙子元素,然后是进一步......)来处理宽松的通配符时,这才有效,并试图递归地验证它们。(此行为在 XSD 1.0 中是可选的,但已广泛实施。)

于 2013-11-09T01:13:52.243 回答