0

xhtml 数据是否有内置的模式数据类型?假设我想指定一个包含两个“woozles”的“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:元素引用:Relax-NG 解析器错误:引用 xhtml 没有匹配的定义 ./lab.rng:43:元素引用:Relax-NG 解析器错误:内部找不到引用 xhtml 的定义

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

4

3 回答 3

1

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

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

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

于 2011-03-01T19:38:24.203 回答
0

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

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

于 2010-06-18T00:44:09.320 回答
0

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

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

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

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

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

于 2010-06-18T02:58:26.550 回答