Синтаксис 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>