我需要接受2种元素的属性语法:
<fsinfo line="70" comment="# a comment" />
<fsinfo line="80" real_dev="/dev/sda2" mount_dev="LABEL=root" mp="/" fs="ext4" options="defaults" dump="1" pass="1" />
我创建了一个能够验证第80行的xsd:
<xsd:element name="fsinfo">
<xsd:complexType>
<xsd:attribute name="line"/>
<xsd:attribute name="real_dev" use="required"/>
<xsd:attribute name="mount_dev"/>
<xsd:attribute name="mp" use="required"/>
<xsd:attribute name="fs" use="required"/>
<xsd:attribute name="mkfs_opts"/>
<xsd:attribute name="options" default="defaults"/>
<xsd:attribute name="dump" use="required"/>
<xsd:attribute name="pass" use="required"/>
<xsd:attribute name="format"/>
<xsd:attribute name="comment"/>
</xsd:complexType>
</xsd:element>
要验证第70行,我可以这样做:
<xsd:element name="fsinfo">
<xsd:complexType>
<xsd:attribute name="line"/>
<xsd:attribute name="comment"/>
</xsd:complexType>
</xsd:element>
1 /如何合并这两种语法,以便可以验证第70行和第80行?
2 /如何避免使用空的fsinfo标记?
3 /“ fsinfo”属性可以按任意顺序
重要的是,如果存在多个“行”和“注释”属性(例如“ mount_dev”),那么必须存在所有关联的必需参数。(第80行验证方案)
注意:我无法更改xml文件,因为我必须保持与旧软件的兼容性(我正在添加验证以使其更可靠)。
Note2:用于验证的工具:xmlstarlet --err --xsd myxsdfile.xsd myxmlfile.xml
答案 0 :(得分:1)
不幸的是,我不知道您是否可以使用xsd 1.1 使用断言的可能性很大,可以帮助您进行管理。
我无法观察到完整的xml示例以及xsd,但可以创建一个示例xsd如何使用断言。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" elementFormDefault="qualified" vc:minVersion="1.1">
<xs:element name="root" type="root"/>
<xs:complexType name="root">
<xs:sequence>
<xs:element name="fsinfo">
<xs:complexType>
<xs:attribute name="line"/>
<xs:attribute name="real_dev"/>
<xs:attribute name="mount_dev"/>
<xs:attribute name="mp"/>
<xs:attribute name="fs"/>
<xs:attribute name="mkfs_opts"/>
<xs:attribute name="options"/>
<xs:attribute name="dump"/>
<xs:attribute name="pass"/>
<xs:attribute name="format"/>
<xs:attribute name="comment"/>
<xs:assert test="(@line and @comment and not(@real_dev) and not(@mount_dev) and not(@mp) and not(@fs) and not(@mkfs_opts) and not(@dump) and not(@pass) and not(@options) and not(@format)) or ((@line and @real_dev and @mp and @fs and @dump and @pass) and ( @mount_dev or @mkfs_opts or @options or @format or @comment))"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>