如何在 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
,即 script
、noscript
、template
、style
、link
和 [=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:title
和 dct:type
值]属性。
在此处的 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
,即script
、noscript
、template
、style
、link
和 [=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:title
和 dct:type
值]属性。