【问题标题】:built-in schema datatype for html / xhtmlhtml / xhtml 的内置模式数据类型
【发布时间】:2011-03-05 05:38:57
【问题描述】:

是否有用于 xhtml 数据的内置模式数据类型?假设我想指定一个包含两个“woozle”的“boozle”元素,每个“woozle”都是任意的 xhtml。我想写这样的东西,使用放松 NG 紧凑语法:

namespace nifty = "http://brinckerhoff.org/nifty/"

start = element nifty:boozle {woozle, woozle}

woozle = element nifty:woozle {xhtml}

不幸的是,xmllint 然后发出此错误信号:

./lab.rng:43: element ref: Relax-NG parser error : Reference xhtml has no matching definition ./lab.rng:43: element ref: Relax-NG parser error : Internal found no define for ref xhtml

所以我的问题是:我应该用什么东西代替上面的“xhtml”吗?

【问题讨论】:

    标签: xml validation xhtml relaxng


    【解决方案1】:

    您的 woozles 和 boozles 在您的命名空间中,而 xhtml 元素在 xhtml 命名空间中。架构验证 a 命名空间 - 您的架构验证您的命名空间,而 xhtml 架构验证 xhtml 命名空间。您可以通过强制其所有子元素都在 xhtml 命名空间中来限制元素包含 xhtml,但您的架构不应验证 xhtml 命名空间本身。

    您可以使用 xhtml 架构来验证文档中的任何 xhtml 命名空间节点。您将此架构添加到您的处理管道中,即第二个验证步骤。

    【讨论】:

    • 我们不是相当在这里连接。如果我对您的理解正确,您的意思是不可能指定一个放松的 NG 模式来验证漂亮的命名空间的元素和 xhtml 命名空间的元素,这让我觉得不幸但似乎是合理的。不过,您是否还建议,我可以用 nothing 代替上面的“xhtml”,并且我必须退回到通过手动编写验证代码来检查架构?那将是不幸的。
    • 验证分为两部分:在漂亮的模式中,您说 woozle 子项位于 xhtml 命名空间中。然后,您还可以使用 xhtml 模式 (w3.org/TR/xhtml1-schema) 来验证 xhtml 节点。我想最简单的方法是使用带有两个模式验证通道的 xml 管道 - 一个用于漂亮的 Relaxng 模式,一个用于 xhtml w3c 模式。
    • Urg... 这么近。回到我原来的问题:what 我应该在 Relax NG 模式中放入什么来表明 woozle 子级在 xhtml 命名空间中?我只是尝试了几个合理的猜测,但没有成功。特别是,我认为我在这里真正需要的是对数据类型 la xsd 的引用。
    • 好的,我正在逐渐偏离协议。具体来说,我认为我现在认为当您建议模式验证名称空间时您是错误的。特别是,在我看来,模式和命名空间本质上是正交的。
    【解决方案2】:

    啊……好吧,Relax NG 文档的更多质量时间为这个问题提供了两种可能的解决方案。

    1) 使用名称类指定匹配所有内容的“anyElement”,如下所示:

    任何元素 = 元素 * { (属性 * { 文本 } |文本 |任何元素)* }

    这有点可怕,因为它只是禁用了对这些元素的检查。不过,有了这个定义,我可以用“anyElement”代替上面的“xhtml”。

    2) 在我看来,一个更好的解决方案是使用 Relax NG 的“include”指令来包含一个完整的 xhtml 规范,假设我能找到一个。

    【讨论】:

    • 在这里给我自己的答案是否被认为是非常糟糕的形式?
    • 更好的解决方案是使用带有多个模式验证器的 XML 管道,一个用于您的命名空间,一个用于 xhtml 命名空间。我在答案 cmets 中链接到 xhtml 架构。
    • 这可能给人以无知或固执的印象,但我不清楚如何将您的建议转化为声明性解决方案。简而言之:您是在建议一种编写 Relax NG 规范的方式,以便我可以使用 jing 或 xmllint 或其他类似工具来验证我的 xml,还是建议更复杂的东西?顺便说一句:非常感谢您的宝贵时间。
    【解决方案3】:

    命名空间和模式在 RELAX NG 中是正交的,而在 XML 模式中它们是紧密耦合的。如果您只想验证您的元素是否在 XHTML 命名空间中,您可以设置如下规则:

    htmlElement = element xhtml:* { (attribute * {text} | text | htmlElement)* }
    

    与上面 anyElement 的定义在同一行。但是,如果您想将内容实际验证为 XHTML,那么您应该对 XHTML 使用 RELAX NG 模式,包括它(有多个起点,取决于您是否想要 XHTML 1.0 严格等),然后参考它的模式html 元素或您想要的任何元素。当您在自己的架构中包含完整架构时,您需要说“include 'blahblah' { start = } 以覆盖包含的架构自己的开始符号。

    【讨论】:

      猜你喜欢
      • 2011-02-27
      • 1970-01-01
      • 2011-02-09
      • 2023-04-01
      • 1970-01-01
      • 2013-07-08
      • 1970-01-01
      • 2013-09-05
      相关资源
      最近更新 更多