在RelaxNG紧凑语法架构中:
https://github.com/validator/validator/blob/master/schema/html5/rdfa.rnc#L51
...我想编辑一些固定的rdfa属性' property' meta
元素中的值。
我定义了两个值,如:
common.attrs.rdfa.property.title = attribute property {"dct:title"}
common.attrs.rdfa.property.type = attribute property {"dct:type"}
...... meta
元素中这两个应该是强制性的,如何在现有的rdfa common.attrs.rdfa.property
列表中完成此操作?
我在尝试添加这些时遇到错误..
答案 0 :(得分: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=…>
元素和<meta property=dct:type content=…>
元素以及的文档的文档都会导致错误。
因此,最大的限制是您无法使用interleave(&
),而是需要对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
元素meta
属性的必需property=dct:title
元素meta
属性的必需property=dct:type
元素我认为只要您使用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
关键字。
但是,无论如何,对common.attrs.rdfa.property
进行更改绝不会让您满意,只要要求文档同时包含<meta property=dct:title content=…>
和<meta property=dct:type content=…>
元素。
所有进行更改的人都会得到你(如果它可以解决语法问题),它允许dct:title
属性的特定dct:type
和property
值