1

在这里的 RelaxNG 紧凑语法模式中:

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

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

我定义了两个值,例如:

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

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

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

4

1 回答 1

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=…&gt;元素和<meta property=dct:type content=…&gt;元素的文档 - 并且按该顺序- 都会导致错误。

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

原因是在 RNC 中的 InterleaveCan 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=…&gt;<meta property=dct:type content=…&gt;

在那里进行的所有更改都会使您受益(如果您可以克服语法问题),它将允许属性dct:title的特定dct:type值。property

于 2017-08-15T05:39:26.790 回答