好的,只要您愿意接受一些限制,这是可行的。方法如下:
在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 和Can 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,即任意数量的 script、noscript、template、style、link 和 meta 元素
- 后跟带有
property=dct:title 属性的必需meta 元素
- 后跟带有
property=dct:type 属性的必需meta 元素
我认为这是最接近你想要的,只要你使用的是 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关键字。
但无论如何,就要求文档同时具有<meta property=dct:title content=…> 和<meta property=dct:type content=…> 元素而言,对common.attrs.rdfa.property 进行更改永远不会得到您想要的。
在那里进行的所有更改都可以帮助您(如果您可以解决语法问题),它将允许 property 属性的特定 dct:title 和 dct:type 值。