xsd: определить синтаксис двух возможных атрибутов для элемента? - PullRequest
0 голосов
/ 19 марта 2019

Мне нужно принять синтаксис 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

1 Ответ

1 голос
/ 20 марта 2019

К сожалению, у меня нет информации, если вы можете использовать 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>
...