首页 > 解决方案 > 如何定义具有任何名称但强制执行特定属性的元素?

问题描述

我有一个包含这样定义的 XML:

<addr15 type="binary" size="1" data_characters="0,1,0,1">text 15</addr15>
<addr14 type="binary" size="1" data_characters="0,1,0,1">text 14</addr14>
<addr13 type="binary" size="1" data_characters="0,1,0,1">text 13</addr13>
<addr12 type="binary" size="1" data_characters="0,1,0,1">text 12</addr12>
<addr11 type="binary" size="1" data_characters="0,1,0,1">text 11</addr11>

由于元素的名称是用户定义的(任何有效的字符串都可以),因此属性是强制性的。

如何定义 XSD 来验证这一点?

使用<xsd:any>不会完成这项工作 - 它无法验证属性。设置processContentslaxstrict不执行该工作,因为我无法提供所需的 XSD 语句进行验证。

标签: xsd

解决方案


元素的名称是用户定义的(任何有效的字符串都可以) XSD 主要描述文档中的标签名称,以及它们如何有效组合。因此,使用 XSD 来描述这种 XML 格式会很棘手。

选项(按我的喜好排列):

  1. 将标签名称更改为<addr>并定义一个新的必需属性“addrNumber”以保存 11、12、13、14、15。这很容易使用 XSD 来描述。
  2. 将所有允许的标签名称预先声明<addrNN>为 XSD 中的全局元素。禁止任何未在 XSD 中预先声明的标记名称(高级用户可以将自己的声明添加到 XSD)
  3. 继续允许用户定义标签名称。定义一个全局的 complex-type-with-simple-content 来描述属性和标签值。每个用户定义的<addrNN>标记都必须包含一个指向此全局类型的 xsi:type 属性。我认为这将需要一个带有 processContents='strict' 的 xsd:any 来确保 xsi:type 属性得到严格验证。

我不会详细介绍每个选项,但如果您需要,我可以提供更多详细信息。


推荐阅读