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

How to add new meta-property values in rdfa.rnc

在此处的 RelaxNG 紧凑语法架构中:

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

…我想在 meta 元素中使用一些固定的 rdfa 属性 'property' 值进行编辑。

我定义了两个值,例如:

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

…这两个在 meta 元素中应该是强制性的,如何在现有的 rdfa common.attrs.rdfa.property 列表中做到这一点?

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

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

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=…> 元素——并且 的顺序是 ——将导致错误.

所以最大的限制是您不能使用交错 (&),而是需要对 meta 元素进行特定排序。

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

其要点是:禁止对同名元素进行交错定义,这是为使实现更可行而有意添加到 RelaxNG 中的设计限制。

所以上面 head.inner 的(重新)定义说 HTML head 元素允许有:

  • 交错:
    • 一个必需的 title 元素
    • 一个可选的 base 元素
    • common.inner.metadata,即 scriptnoscripttemplatestylelink 和 [=18 的任意数量=] 元素
  • 后跟具有 property=dct:title 属性的必需 meta 元素
  • 后跟具有 property=dct:type 属性的必需 meta 元素

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

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

相反,你只会得到这个:

head is missing a required instance of one or more of the following child elements: meta

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

When declaring this I am getting something like data and string error

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

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

…当你需要做的是:

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

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

但是无论如何,就要求文档同时具有 <meta property=dct:title content=…><meta property=dct:type content=…> 元素而言,对 common.attrs.rdfa.property 进行更改永远不会得到您想要的结果。

所有在那里进行的更改都会让你(如果你能克服语法问题)是,它允许 property 的特定 dct:titledct:type 值]属性。