Как объявить элемент внутри элемента с тем же именем в DTD для XML? - PullRequest
1 голос
/ 10 декабря 2011

предположим, что у нас есть корневой элемент с именем first

теперь у первого есть 2 подэлемента, называемых вторым и третьим, или просто текст (#PCDATA)

второй всегда должен быть объявлен перед третьим элементом

теперь второй субэлемент может иметь другой (ТОЛЬКО ОДИН) второй субэлемент или просто текст (#PCDATA)

третий подэлемент может содержать только текст (#PCDATA)

Так что у нас может быть что-то вроде этого:

      <first>
           <second> I'm in second </second>
           <third> I'm in third </third>
      </first>

или как-то так:

      <first>
           <second> 
                <second> I'm in second </second>
           </second>
           <third> I'm in third </third>
      </first>

сложность здесь в том, как сделать так, чтобы первый второй элемент мог принимать только ОДИН второй субэлемент хотя второй подэлемент также является вторым элементом, он не сможет принимать другие элементы, кроме текста, поскольку он уже является подэлементом другого элемента

Я пытался создать что-то вроде этого

    <!DOCTYPE first [

        <!ELEMENT first (second,third)>
        <!ELEMENT second (#PCDATA | second, third)>
        <!ELEMENT third (#PCDATA)>
     ]>

но, к сожалению, это вообще не работает

Я использую этот валидатор: http://validator.w3.org/check

и для этого кода

  <?xml version="1.0" encoding="UTF-8" standalone="no"?>

    <!DOCTYPE first [

        <!ELEMENT first (second,third)>
        <!ELEMENT second (#PCDATA | second, third)>
        <!ELEMENT third (#PCDATA)>
     ]>

      <first>
           <second> I'm in second </second>
           <third> I'm in third </third>
      </first>

это дает мне ошибки

есть идеи?

1 Ответ

2 голосов
/ 11 декабря 2011

Всякий раз, когда у вас смешанная модель контента (как PCDATA, так и другие элементы), вы не можете указать порядок с оператором / соединителем последовательности , («сопровождаемый»).

Вы должны использовать оператор / разъем последовательности | ("или").Вы также не можете смешивать , и | в одной группе.Вы также должны использовать индикатор вхождения * («ноль или более»).

Пример

<!DOCTYPE first [
<!ELEMENT first (second,third)>
<!ELEMENT second (#PCDATA|second|third)*>
<!ELEMENT third (#PCDATA)>
]>
...