是否可以重复使用 '(“0” |“1”)' 通过 DTD 中的参数实体?

Is it possible to re-use `("0" | "1")` via a parameter entity in DTD?

提问人:U. Windl 提问时间:8/29/2023 最后编辑:U. Windl 更新时间:8/31/2023 访问量:33

问:

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

一件事是,并且用于多个标签的布尔值,因此我尝试定义为“参数实体”,但因各种语法错误而失败。01("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 语法 DTD

评论

0赞 Martin Honnen 8/29/2023
目前尚不清楚您希望在/with中实现什么,请参阅 w3.org/TR/xml/#elemdecls 以获取一些元素声明示例。也许添加一些 XML 示例,显示要使用 DTD 定义的元素类型。<!ELEMENT Error %BOOL;>
0赞 U. Windl 8/29/2023
如前所述,“XML 汤”的“结构”实际上并不存在。所示示例只是一个元素,可以包含(根据书面文档)或 。还有另一个名为 的元素,也可以包含 或 。因此,我想定义一些布尔值,可以这么说,我可以将其用作“内容模型”。现在更清楚了吗?01Warning01

答:

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 要难得多。关于我之前的评论:我认为添加链接对你来说是相当微不足道的。我会自己试试......