Как сделать взаимоисключающие атрибуты в XML-схеме?

Вы можете сравнить даты с классом PHP DateTime :

$date = new DateTime($event['date']);
$now = new DateTime();

if($date < $now) {
    echo 'date is in the past';
}

Смотреть в прямом эфире


Примечание. Использование класса DateTime предпочтительнее strtotime(), поскольку последнее будет работать только для дат до 2038 года. Подробнее о Year_2038_problem .

14
задан Deduplicator 1 February 2015 в 14:04
поделиться

3 ответа

Так как RelaxNG был упомянут в ответе Alnitak, вот решение с RelaxNG (язык, который является, в большинстве случаев, лучше, чем Схема W3C). Действительно отметьте ИЛИ (|) в определении элемента:

start = document
document = element document {elem+}
elem = element elem {ref | value}
ref = attribute ref {text}
value = attribute value {xsd:integer}

Если у меня есть этот XML-файл:

<document>
    <elem value="1" />
    <elem ref="something else" />
</document>

Это принято rnv и xmlint:

 % rnv attributes-exclusive.rnc attributes-exclusive.xml             
 attributes-exclusive.xml

 % xmllint --noout --relaxng attributes-exclusive.rng attributes-exclusive.xml 
 attributes-exclusive.xml validates

Если я добавляю в XML-файле:

<elem value="1" ref="something else" />

Я получаю ошибки проверки, как я хочу (действительно обратите внимание, что сообщения об ошибках являются субоптимальными):

% rnv attributes-exclusive.rnc attributes-exclusive.xml    
attributes-exclusive.xml
attributes-exclusive.xml:4:0: error: attribute ^ref not allowed
required:
       after

% xmllint --noout --relaxng attributes-exclusive.rng attributes-exclusive.xml
attributes-exclusive.xml:4: element elem: Relax-NG validity error : Invalid attribute value for element elem
attributes-exclusive.xml fails to validate
5
ответ дан 1 December 2019 в 10:19
поделиться

К сожалению, AFAIK, Вы не можете сделать этого с XML-схемой, у меня была та же проблема самого.

Я видел, что это предположило это при необходимости в обоих из:

<elem type="xxx"> 
<elem ref="yyy">

затем <elem> самостоятельно должен быть разделен на два типа, так как они ясно получили различные атрибуты...

7
ответ дан 1 December 2019 в 10:19
поделиться

Вы не можете сделать с атрибутами, но Вы можете с дочерними элементами...

<element name="elem">
    <complexType>
        <choice>
            <element name="value"/>
            <element name="ref"/>
        </choice>
    </complexType>
</element>

Таким образом, Вы можете иметь...

<elem>
    <value>1</value>
</elem>

или...

<elem>
    <rel>something else</rel>
</elem>
9
ответ дан 1 December 2019 в 10:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: