xsd - 如何定义具有任何名称但强制执行特定属性的元素?
问题描述
我有一个包含这样定义的 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>
不会完成这项工作 - 它无法验证属性。设置processContents
为lax
或strict
不执行该工作,因为我无法提供所需的 XSD 语句进行验证。
解决方案
元素的名称是用户定义的(任何有效的字符串都可以) XSD 主要描述文档中的标签名称,以及它们如何有效组合。因此,使用 XSD 来描述这种 XML 格式会很棘手。
选项(按我的喜好排列):
- 将标签名称更改为
<addr>
并定义一个新的必需属性“addrNumber”以保存 11、12、13、14、15。这很容易使用 XSD 来描述。 - 将所有允许的标签名称预先声明
<addrNN>
为 XSD 中的全局元素。禁止任何未在 XSD 中预先声明的标记名称(高级用户可以将自己的声明添加到 XSD) - 继续允许用户定义标签名称。定义一个全局的 complex-type-with-simple-content 来描述属性和标签值。每个用户定义的
<addrNN>
标记都必须包含一个指向此全局类型的 xsi:type 属性。我认为这将需要一个带有 processContents='strict' 的 xsd:any 来确保 xsi:type 属性得到严格验证。
我不会详细介绍每个选项,但如果您需要,我可以提供更多详细信息。
推荐阅读
- php - php artisan cache clear PDOException 找不到驱动
- javascript - jsPDF 类型不存在属性“fromHTML”
- reactjs - 在正方形中反应 Konva 中心文本
- python - 亚马逊卖家中心 - SP-API - 获取货件标签
- ajax - 数据没有从 ajax 传递到控制器
- javascript - 如何用vue制作自定义轮播动画?
- laravel - 在一个视图中显示多个图像 laravel 7
- github-api - 从 github 下载最新的 git/git 版本
- kubernetes - kubelet 重启后,节点状态始终为 Ready,SchedulingDisabled
- plc - 如何将变量类型作为参数传递给 IEC61131-3 结构化文本 (TwinCAT3) 中的函数?