2017-05-10 116 views
1

无法包裹我的头 - 为什么xmllint抱怨这个dtd语法,具体为et_snote一行。 - 我在这里做错了什么?这个dtd语法有什么问题?

<!ELEMENT et_snote (is_required?, (#PCDATA | vis? | ri?)*) > 
<!ELEMENT is_required (#PCDATA) > 

我得到这个错误:

schema.dtd:166: parser error : expected '>' 
<!ELEMENT et_snote (is_required?, (#PCDATA | vis? | ri?)+) > 

这是命令我运行:

xmllint --noout --nowarning --nonet --dtdvalid schema.dtd my.xml 

回答

2

您已经声明为元素含量的et_snote类型,其定义cannot have character data,要么摆脱#PCDATA或将类型更改为混合内容。

+0

我不介意声明混合内容 - 卜我将如何确保'is_required'标签永远是第一要素下'et_snote' ? – Dannyboy

+0

你不能,如果你想指定一个订单,你不能允许字符数据。如果必须的话,将字符数据包裹在另一个元素中。 – user657267

+0

le感叹。谢谢! – Dannyboy

-1

我想你已经在使用或|时不允许使用类似?的东西。它也没有意义,因为你在说:“你可以使用这三个元素中的任何一个,但如果你使用第二或第三,你可以忽略它。”我假设你想让这个可选的?and ri。因为你给的替代品,并只想要一个元素,你可以说:

<!ELEMENT et_snode (is_required?, (#PCDATA | vis | ri)+) >