是否可以通过DTD中的参数实体重用`("0" | "1")`?

问题描述 投票:0回答:1

一些公司“抛弃”带有冗长冗长的标签描述的 XML,但从未做出任何努力来正式描述这种混乱的结构。 因此,我尝试根据这样的描述构建 DTD。

有一件事是

0
1
用于多个标签的布尔值,所以我尝试将
("0" | "1" )
定义为“参数实体”,但因各种语法错误而失败。

我最后的尝试是:

<!-- Boolean -->
<!ENTITY _false "0">
<!ENTITY _true "1">
<!ENTITY % BOOL "(&_false; | &_true;)">

<!-- Error -->
<!ELEMENT Error %BOOL;>

xmllint
抛出这样的错误:

Entity: line 1: parser error : ContentDecl : Name or '(' expected
 %BOOL;
       ^
Entity: line 1:
(&_false; | &_true;)
 ^
Entity: line 1: parser error : expected '>'
 %BOOL;
       ^

是否可以为此使用参数实体? 我试图搜索示例,但未能找到一些。 而且我的DTD实践经验也相当少。

另一种变体

实验我尝试了这个:

<!-- Boolean -->
<!ENTITY % BOOL '"0" | "1"'>

<!-- Error -->
<!ELEMENT Error (%BOOL;)>

然后

xmllint
抛出这样的错误:

Entity: line 1: parser error : ContentDecl : Name or '(' expected
 %BOOL;
       ^
Entity: line 1:
"0" | "1"
^
Entity: line 1: parser error : expected '>'
 %BOOL;
       ^
Entity: line 1:
"0" | "1"
^
Entity: line 1: parser error : Content error in the external subset
 %BOOL;
       ^
Entity: line 1:
"0" | "1"
^
xml syntax dtd
1个回答
0
投票

DTD 不能约束文本节点的内容,只能约束属性节点的内容。

对于您正在尝试的内容,您应该使用更强大的模式技术,例如 XML 模式定义 (XSD)REgular LANguage for XML Next Generation (RelaxNG)Schematron

© www.soinside.com 2019 - 2024. All rights reserved.