如何在rdfa.rnc中添加新的元属性值

时间:2017-08-09 10:52:16

标签: html5 w3c-validation relaxng relaxng-compact

在RelaxNG紧凑语法架构中:

https://github.com/validator/validator/blob/master/schema/html5/rdfa.rnc#L51

...我想编辑一些固定的rdfa属性' property' meta元素中的值。

我定义了两个值,如:

common.attrs.rdfa.property.title = attribute property {"dct:title"}
common.attrs.rdfa.property.type = attribute property {"dct:type"}

...... meta元素中这两个应该是强制性的,如何在现有的rdfa common.attrs.rdfa.property列表中完成此操作?

我在尝试添加这些时遇到错误..

1 个答案:

答案 0 :(得分:1)

好的,只要你愿意接受一些限制,这是可行的。方法如下:

https://github.com/validator/validator/blob/master/schema/html5/meta.rnc#L33文件中,将head.inner更改为:

head.inner =
        (       title.elem
        &       base.elem?
        &       common.inner.metadata
        ),
        meta.property.dct.title.elem,
        meta.property.dct.type.elem

meta.property.dct.title.elem =
        element meta { empty & meta.property.dct.title.attrs }
meta.property.dct.title.attrs =
        (       meta.attrs.property.dct.title
        &       meta.name.attrs.content
        )
meta.attrs.property.dct.title =
        attribute property { string "dct:title" }

meta.property.dct.type.elem =
        element meta { empty & meta.property.dct.type.attrs }
meta.property.dct.type.attrs =
        (       meta.attrs.property.dct.type
        &       meta.name.attrs.content
        )
meta.attrs.property.dct.type =
        attribute property { string "dct:type" }

然后以下文档不会导致错误:

<!DOCTYPE html>
<html>
<head>
<title>Test</title>
<meta property=dct:title content=bar>
<meta property=dct:type content=bar>
</head>
<body></body>
</html>

...但是,任何同时没有<meta property=dct:title content=…>元素和<meta property=dct:type content=…>元素以及的文档的文档都会导致错误。

因此,最大的限制是您无法使用interleave(&),而是需要对meta元素进行特定排序。

原因是问题Interleave In RNCCan relaxng specify an unordered set of elements with the same name, but different attributes?以及https://www.oasis-open.org/committees/relax-ng/spec-20011203.html#interleave-restrictions已经解释过了:

它的要点是:禁止交换同名元素的定义,并且这是对RelaxNG添加的有意设计限制,以使实现更加可行。

因此head.inner的上述(重新)定义表明允许HTML head元素具有:

  • 交错:
    • 必需的title元素
    • 可选的base元素
    • common.inner.metadata,任意数量的scriptnoscripttemplatestylelinkmeta元素
  • 后跟带有meta属性的必需property=dct:title元素
  • 后跟带有meta属性的必需property=dct:type元素

我认为只要您使用RelaxNG,这就是您最接近想要的东西。

它的另一个限制是,如果其中一个缺失,它将不会给你非常有用的错误消息。

相反,你会得到这个:

  

head缺少一个或多个必需的实例   以下子元素:meta

也就是说,它不会(至少jing不会)告诉你你遗失的那个property=dct:type

  

当声明这个时,我得到的东西就像数据和字符串错误

我认为你遇到了这个问题,因为你这样做了:

common.attrs.rdfa.property.title = attribute property {"dct:title"}

......当你需要做的事情是这样的时候:

common.attrs.rdfa.property.title = attribute property {string "dct:title"}

...也就是说,您需要在那里指定string关键字。

但是,无论如何,对common.attrs.rdfa.property进行更改绝不会让您满意,只要要求文档同时包含<meta property=dct:title content=…><meta property=dct:type content=…>元素。

所有进行更改的人都会得到你(如果它可以解决语法问题),它允许dct:title属性的特定dct:typeproperty