编写 DTD:如何实现此子设置

发布于 2024-08-23 10:40:48 字数 663 浏览 12 评论 0原文

元素 tasklist 最多可以包含一个 title 和最多一个 description,此外还可以包含任意数量(包括 0)task 元素以任意顺序。

天真的方法不适用,因为顺序不重要:

<!ELEMENT tasklist (title?, description?, task*) >

或者,我可以明确命名所有可能的选项:

(title, description?, task*) |
(title, task+, description?, task*) |
(task+, title, task*, description?, task*) |
(description, title?, task*) |
(description, task+, title?, task*) |
(task+, description, task*, title?, task*) |
(task*)

但是编写一个非确定性规则非常容易,而且它看起来像直接通往最黑暗的疯狂。有什么想法,如何可以更优雅地做到这一点?

不,XSD 或 RelaxNG 不是选择。我需要一个简单的、旧的 DTD。

The element tasklist may contain at most one title and at most one description, additionally any number (incl. 0) task elements in any order.

The naive approach is not applicable, since the order should not matter:

<!ELEMENT tasklist (title?, description?, task*) >

Alternatively, I could explicitly name all possible options:

(title, description?, task*) |
(title, task+, description?, task*) |
(task+, title, task*, description?, task*) |
(description, title?, task*) |
(description, task+, title?, task*) |
(task+, description, task*, title?, task*) |
(task*)

but then it's quite easy to write a non-deterministic rule, and furthermore it looks like the direct path to darkest madness. Any ideas, how this could be done more elegantly?

And no, an XSD or RelaxNG is no option. I need a plain, old DTD.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

吹梦到西洲 2024-08-30 10:40:48

这总结了您需要的内容:

<!ELEMENT tasklist (task*, ((title?, task*, description?) |
                    (description?, task*, title?)), task*)>

description 之前/之后出现的 title 的替换。

但是,这不是确定性内容模型,如 @13ren 在他的回答中解释了。 [这是 Microsoft 的另一个示例](http:// /msdn.microsoft.com/en-us/library/9bf3997x(VS.71).aspx)

简而言之,

您的要求是拥有一个非确定性模型,因此,您的场景不可能有有效 DTD。

元素

如果您设置一个简单的限制,即如果 taskdescription 都必须是最后一个元素,则 taskdescription 必须是最后一个 提供后,您可以使用此确定性 DTD 声明:

<!ELEMENT tasklist (
  task*,
  ((title, task*, description?) | 
  (description, task*, title?))?
)>

示例:

<!-- Valid -->
<tasklist>
  <task></task>
  <task></task>
  <task></task>
  <title></title>
  <task></task>
  <description></description>
</tasklist>
<!-- Valid -->
<tasklist>
  <title></title>
  <task></task>
  <task></task>
  <task></task>
</tasklist>
<!-- Invalid
<tasklist>
  <task></task>
  <title></title>
  <task></task>
  <description></description>
  <task></task>
</tasklist>
-->

或者,可能更自然地,强制 titledescription 元素必须是第一个元素,并且两个 titledescription 元素必须存在或不存在。

<!ELEMENT tasklist (
  ((title, task*, description) | 
  (description, task*, title))?,
  task*
)>

示例:

<!-- Valid -->
<tasklist>
  <title></title>
  <task></task>
  <description></description>
  <task></task>
  <task></task>
</tasklist>
<!-- Invalid
<tasklist>
  <task></task>
  <title></title>
  <description></description>
  <task></task>
  <task></task>
</tasklist>

<tasklist>
  <title></title>
  <task></task>
  <task></task>
  <task></task>
</tasklist>
-->

否则

否则,您需要使用 RELAX NG,它允许非确定性模型。

This summarises what you need:

<!ELEMENT tasklist (task*, ((title?, task*, description?) |
                    (description?, task*, title?)), task*)>

Alternation for the title appearing before/after description.

However, this is not a deterministic content model, as @13ren explains in his answer. [Here is another example from Microsoft](http://msdn.microsoft.com/en-us/library/9bf3997x(VS.71).aspx).

In short

Your requirements is to have a non-deterministic model, and as such, there is no possible valid DTD for your scenario.

Alternatives

If you place a simple restriction that either task or description must be the last element if both task and description are provided, you can use this deterministic DTD declaration:

<!ELEMENT tasklist (
  task*,
  ((title, task*, description?) | 
  (description, task*, title?))?
)>

Examples:

<!-- Valid -->
<tasklist>
  <task></task>
  <task></task>
  <task></task>
  <title></title>
  <task></task>
  <description></description>
</tasklist>
<!-- Valid -->
<tasklist>
  <title></title>
  <task></task>
  <task></task>
  <task></task>
</tasklist>
<!-- Invalid
<tasklist>
  <task></task>
  <title></title>
  <task></task>
  <description></description>
  <task></task>
</tasklist>
-->

Or, possibly more naturally, enforce that a title or description element must be the first element, and both title and description elements must exist or be non-existent.

<!ELEMENT tasklist (
  ((title, task*, description) | 
  (description, task*, title))?,
  task*
)>

Examples:

<!-- Valid -->
<tasklist>
  <title></title>
  <task></task>
  <description></description>
  <task></task>
  <task></task>
</tasklist>
<!-- Invalid
<tasklist>
  <task></task>
  <title></title>
  <description></description>
  <task></task>
  <task></task>
</tasklist>

<tasklist>
  <title></title>
  <task></task>
  <task></task>
  <task></task>
</tasklist>
-->

Otherwise

Otherwise, you need to use RELAX NG, which allows for non-deterministic models.

撩心不撩汉 2024-08-30 10:40:48

为什么顺序不重要?

在我看来,这里的顺序似乎相当重要;唯一合理的顺序是标题?、描述?、任务*。

灵活性固然很好,但有时并不是必需的。

Why is the order unimportant?

It seems to me as if the order is rather a bit important right here; and that the only sensible order is title?, description?, task*.

Flexibility is nice and all, but sometimes it's just not neccessary.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文