ошибка недетерминированной модели содержимого DTD

Данный:

<!ELEMENT diagnostic-tracks (hookup*, (%step;)*, ((diagnostic-track-automated, diagnostic-track-manual) | diagnostic-track-automated | diagnostic-track-manual), evaluate*, disconnect*)>

а также

<!ELEMENT diagnostic-track-automated (((%step;) | diagnostic_group)*, diagnostic_group, evaluate*)>

<!ENTITY % step "((%figtab;) | step1 | step1-alt)">
<!ENTITY % figtab "figure | figure-alt | table | table-alt | lubetab">

Я получаю сообщения об ошибках недетерминированной модели содержимого, из-за которых диагностическая автоматизация отслеживания и диагностическая_группа могут одновременно соответствовать двум или более токенам.

Я изменил на:

<!ELEMENT diagnostic-tracks (hookup*, (%step;)*, diagnostic-track-automated?, diagnostic-track-manual?, evaluate*, disconnect*)>

а также

<!ELEMENT diagnostic-track-automated (((%step;) | diagnostic_group+)*, evaluate*)>

что устранило сообщения об ошибках, но я не думаю, что мои изменения, особенно для diagnostic-track-automated, правильны.

Я ценю любые предложения по улучшению.


person Caroline    schedule 27.02.2020    source источник
comment
Можете ли вы добавить объявление сущности параметра step, чтобы мы могли видеть, что такое %step;?   -  person Daniel Haley    schedule 27.02.2020


Ответы (1)


Я думаю, что то, что вы придумали для diagnostic-tracks, похоже, то, что вы пытались сделать с исходной недетерминированной моделью:

ноль или более элементов hookup, за которыми следует
ноль или более элементов из %step;, за которыми следует
ноль или один элемент diagnostic-track-automated, за которым следует
ноль или один элемент diagnostic-track-manual, за которым следует
ноль или более элементов disconnect

Однако я думаю, что исправление для diagnostic-track-automated - это не то, что вы изначально планировали.

То, что вы предлагаете сейчас, это:

ноль или более элементов из %step; или diagnostic_group, за которыми следует
ноль или более evaluate элементов

Я думаю, что вы имели в виду:

ноль или более элементов из %step;, за которыми следует
один или более элементов diagnostic_group, за которыми следует
ноль или более элементов evaluate

Что было бы:

<!ELEMENT diagnostic-track-automated ((%step;)*, diagnostic_group+, evaluate*)>

Вот полный/проверяемый пример...

DTD (so.dtd)

<!ENTITY % figtab "figure | figure-alt | table | table-alt | lubetab">
<!ENTITY % step "%figtab; | step1 | step1-alt">

<!ELEMENT diagnostic-tracks (hookup*, (%step;)*, diagnostic-track-automated?, diagnostic-track-manual?, evaluate*, disconnect*)>

<!ELEMENT diagnostic-track-automated ((%step;)*, diagnostic_group+, evaluate*)>

<!ELEMENT table EMPTY>
<!ELEMENT table-alt EMPTY>
<!ELEMENT diagnostic_group EMPTY>
<!ELEMENT step1-alt EMPTY>
<!ELEMENT evaluate EMPTY>
<!ELEMENT figure EMPTY>
<!ELEMENT figure-alt EMPTY>
<!ELEMENT lubetab EMPTY>
<!ELEMENT step1 EMPTY>
<!ELEMENT diagnostic-track-manual EMPTY>
<!ELEMENT disconnect EMPTY>
<!ELEMENT hookup EMPTY>

XML

<!DOCTYPE diagnostic-tracks SYSTEM "so.dtd">
<diagnostic-tracks>
    <diagnostic-track-automated>
        <diagnostic_group/>
    </diagnostic-track-automated>
    <diagnostic-track-manual/>
</diagnostic-tracks>
person Daniel Haley    schedule 28.02.2020
comment
Спасибо, Даниил, это устранило ошибки. Однако я думал, что ((%step;) | diagnostic_group+)* означает, что &step; может следовать за <diagnostic_group> - person Caroline; 29.02.2020
comment
@Caroline - Да, это правда, и это то, что я пытался сказать, используя ноль или более элементов из %step; или диагностическая_группа, за которой следует. Таким образом, это в основном: (figure|figure-alt|table|table-alt|lubetab|step1|step1-alt|diagnostic_group)* (индикатор появления + на diagnostic_group ничего не значит, потому что он находится в этом нуле или больше или в группе). Извините, что не было более ясно. Надеюсь, мой комментарий имеет смысл. - person Daniel Haley; 29.02.2020
comment
ты был чист, я нет. Я имел в виду, что я думал, что ((%step;) | diagnostic_group+)* позволит %step;<diagnostic_group>%step; <diagnostic_group><evaluate>, но ((%step;)*, diagnostic_group+ не разрешит %step; после <diagnostic_group> - person Caroline; 29.02.2020
comment
@ Кэролайн - Да, ты говоришь правильно. Нужно ли иметь %step; после diagnostic_group? - person Daniel Haley; 29.02.2020
comment
Да, спасибо. На самом деле это из MIL STD 40051C v6.3 dtd. - person Caroline; 29.02.2020
comment
@Caroline - Я бы добавил , (%step;)* после diagnostic_group+ вот так: <!ELEMENT diagnostic-track-automated ((%step;)*, diagnostic_group+, (%step;)*, evaluate*)> - person Daniel Haley; 29.02.2020