Синтаксис DTD - разрешить подэлемент ИЛИ pcdata

Моя структура.xml может содержать следующие данные:

<entry id="one-string">
            <class>nmWinMultiReports_main</class>
            <classParams>string</classParams>
         </entry>
<entry id="multiple-elements">
            <class>nmJavaScript_main</class>
            <classParams>
               <pluginid>monitorPlugin</pluginid>
               <bla>string</bla>
               <tag>abc</tag>
            </classParams>
         </entry>

Как определить файл.dtd, чтобы разрешить classParams 1. быть ли строкой или 2. несколькими подэлементами (по одному разу)?

Я старался:

<!ELEMENT class ( #PCDATA ) >
<!ELEMENT classParams ( #PCDATA | pluginid | bla | tag ) >
         <!ELEMENT pluginid ( #PCDATA ) >
         <!ELEMENT bla ( #PCDATA ) >
         <!ELEMENT tag ( #PCDATA ) >

3 ответа

Решение

Я сделал это:

<!ELEMENT classParams ( #PCDATA | pluginid | bla | tag )* >

DTD не могут применять ограничение, которое вы описываете; самый простой способ получить что-то вроде этого ограничения - это добавить новый элемент (назовите его string) и объявить classParams как string или последовательность pluginid и т. д. как дети:

<!ELEMENT string (#PCDATA) >
<!ELEMENT classParams (string 
                      | (pluginid, bla, tag))
>

В качестве альтернативы, если

<classParams><string>foo</string></classParams> 

кажется слишком тяжелым, вы могли бы объявить entry как принимать classParams или же classParamString как содержание:

<!ELEMENT entry (class, (classParams | classParamString)) >
<!ELEMENT classParamString (#PCDATA) >
<!ELEMENT classParams (pluginid, bla, tag) >

Вы также можете добиться этого следующим образом:

<!ELEMENT classParams ANY>
Другие вопросы по тегам