提问人:U. Windl 提问时间:8/29/2023 最后编辑:U. Windl 更新时间:8/31/2023 访问量:33
是否可以重复使用 '(“0” |“1”)' 通过 DTD 中的参数实体?
Is it possible to re-use `("0" | "1")` via a parameter entity in DTD?
问:
一些公司“抛弃”了 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"
^
答:
0赞
Michael Kay
8/30/2023
#1
DTD 不能约束文本节点的内容,只能约束属性节点的内容。
对于您正在尝试的内容,您应该使用更强大的架构技术,例如 XML 架构定义 (XSD)、REgular LAnguage for XML Next Generation (RelaxNG) 或 Schematron。
评论
0赞
U. Windl
8/30/2023
实际上,如果我设计了“标签汤”,情况就会有所不同:我正在处理的内容模型根本不使用任何属性。可能我的问题是我使用正则表达式的时间太长了。除了DTD之外,似乎只支持RelaxNG。您会改进您的答案,使用指向相应参考或主页的链接转换您的每种架构技术吗?xmllint
0赞
Michael Kay
8/31/2023
不,我是来回答你的问题的,不是来提供一对一的培训,也不是为你写代码。
0赞
U. Windl
8/31/2023
明白了;实际上,我已经开始学习和编写 RELAX NG,但这比编写 SGML DTD 要难得多。关于我之前的评论:我认为添加链接对你来说是相当微不足道的。我会自己试试......
评论
<!ELEMENT Error %BOOL;>
0
1
Warning
0
1