html / xhtml的内置模式数据类型

时间:2010-06-18 00:28:03

标签: xml validation xhtml relaxng

是否有针对xhtml数据的内置架构数据类型?假设我想指定一个包含两个“woozles”的“boozle”元素,每个元素都是任意的xhtml。我想使用relax NG compact语法编写类似的东西:

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

start = element nifty:boozle {woozle, woozle}

woozle = element nifty:woozle {xhtml}

不幸的是,xmllint会发出错误信号:

./ lab.rng:43:lement ref:Relax-NG解析器错误:引用xhtml没有匹配的定义 ./lab.rng:43:元素ref:Relax-NG解析器错误:内部找不到ref xhtml的定义

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

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

啊......好吧,使用Relax NG文档提供更多优质时间可以为这个问题提供两种可能的解决方案。

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

anyElement =
  element * {
    (attribute * { text }
     | text
     | anyElement)*
  }

这是中等可怕的,因为它只是禁止检查这些元素。但是,通过这个定义,我可以在上面添加“anyElement”代替“xhtml”。

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