好的,只要您愿意接受一些限制,这是可行的。就是这样:
在 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
元素进行特定排序。
原因是在 RNC 中的 Interleave和Can Relaxng 可以指定一组具有相同名称但不同属性的无序元素的问题中已经解释过的内容?并在https://www.oasis-open.org/committees/relax-ng/spec-20011203.html#interleave-restrictions:
它的要点是:禁止对同名元素进行交叉定义,这是一种有意添加到 RelaxNG 的设计限制,以使实现更可行。
所以上面的(重新)定义head.inner
表示head
允许 HTML 元素具有:
- 交错:
- 一个必需的
title
元素
- 可选
base
元素
common.inner.metadata
, 是任意数量的script
, noscript
, template
, style
, link
, 和meta
元素
- 后跟
meta
带有property=dct:title
属性的必需元素
- 后跟
meta
带有property=dct:type
属性的必需元素
只要您使用的是RelaxNG,我认为这是您最接近您想要的东西。
它的另一个限制是,如果其中一个缺失,它不会给你非常有用的错误消息。
相反,你会得到这个:
head
缺少以下一个或多个子元素的必需实例:meta
也就是说,它不会(至少 jing 不会)告诉你你缺少的那个 has 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:type
值。property