如何在使用relaxng compact进行验证时忽略xml元素中的html

时间:2016-05-23 22:45:54

标签: relaxng relaxng-compact

如何在元素中使用忽略html的模式,而不是尝试验证它的验证器

<stuff>
   <data>
      this is some text <b>with the odd</b> bit of html<p>and unclosed tags
   </data>
</stuff>

这不是有效但我尝试过像

这样的事情
datatypes xs = "http://www.w3.org/2001/XMLSchema-datatypes"
start = stuff

stuff = element stuff
{
   element data { * }
}

2 个答案:

答案 0 :(得分:1)

您无法在XML中允许任意未修改的HTML。可以转义单个特殊字符(What are the official XML reserved characters?)或将HTML封装在CDATA容器(Is it possible to insert HTML content in XML document?)中。

答案 1 :(得分:1)

您将无法验证其中包含格式不正确的HTML的XML文档,因为由于格式不正确,此类文档不是XML文档。但实际上,如果您获得的输入是XML,那么您当然可以定义data以允许任何格式良好的HTML元素或任何格式良好的XML。

允许任何格式良好的XML是最简单的。我们定义一个模式而不是“这里任何格式良好的XML”:遇到的任何元素都是使用相同的模式验证的,递归地:

wellformed-xml = (text
                 | element * { wellformed-xml }
                 )*

现在定义data元素以使用该模式:

stuff = element stuff {
            element data { wellformed-xml }
        }

如果你真的想确保它只是HTML,那么你需要一个比“*”更严格的名称类。我已使用bipspandiv对其进行填充,并将其作为练习添加其他元素你想要的。

start = stuff
stuff =
  element stuff {
    element data { wellformed-html }
  }

wellformed-html =
  (text
   | element b | div | i | p | span { wellformed-html }
   )*

如果您也希望能够支持XHTML输入,那么您将需要使用命名空间引用;再次,为读者练习。