Мне нужно принять синтаксис 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" />
Я создал xsd, который может проверять строку 80:
<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" могут быть в любом порядке
Важно, если присутствует больше, чем атрибуты "line" и "comment" (например, "mount_dev", тогда должны присутствовать все связанные обязательные аргументы. (схема проверки строки 80)
Примечание: я не могу изменить свой XML-файл, так как я должен сохранить совместимость со старым программным обеспечением (я добавляю проверку, чтобы сделать его более надежным).
Примечание 2: инструмент, используемый для проверки: xmlstarlet --err --xsd myxsdfile.xsd myxmlfile.xml