代码之家  ›  专栏  ›  技术社区  ›  Boldewyn

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

  •  2
  • Boldewyn  · 技术社区  · 16 年前

    元素 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或放松是没有选择的。我需要一个普通的,旧的DTD。

    2 回复  |  直到 16 年前
        1
  •  3
  •   Community Mohan Dere    9 年前

    这总结了您需要的:

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

    更改 title 出现在之前/之后 description .

    然而 ,这不是确定性内容模型,因为 @13ren explains in his answer . [下面是微软的另一个例子]( http://msdn.microsoft.com/en-us/library/9bf3997x(VS.71).aspx) .

    简而言之

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

    选择

    如果你设置一个简单的限制 task 或 描述 如果两者都是,则必须是最后一个元素 任务 和 描述 如果提供,则可以使用此确定性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>
    -->
    

    或者,可能更自然地,强制 标题 或 描述 元素必须是第一个元素,并且两者都是 标题 和 描述 元素必须存在或不存在。

    <!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>
    -->
    

    否则

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

        2
  •  0
  •   Williham Totland    16 年前

    为什么订单不重要?

    在我看来,订单在这里似乎有点重要;而 明智的 订单是标题?描述?,任务*。

    灵活性是很好的,但有时并不必要。

    推荐文章