Хорошо, это выполнимо, если вы готовы принять некоторые ограничения. Вот как:
В 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 и Может Relaxng указать неупорядоченный набор элементов с помощью одно имя, но разные атрибуты? и на https://www.oasis-open.org/committees/relax-ng/spec-20011203.html#interleave-restrictions:
Суть его такова: существует запрет на чередование определений для элементов с одинаковыми именами, и это преднамеренное конструктивное ограничение, добавленное в RelaxNG, чтобы сделать реализацию более осуществимой.
Таким образом, приведенное выше (пере)определение head.inner
говорит о том, что HTML-элемент head
может иметь:
- an interleave of:
- a required
title
element
- необязательный элемент
base
common.inner.metadata
, то есть любое количество элементов script
, noscript
, template
, style
, link
и meta
- за которым следует обязательный элемент
meta
с атрибутом property=dct:title
- за которым следует обязательный элемент
meta
с атрибутом property=dct:type
Я думаю, что это самое близкое к тому, чего вы хотите, если используете RelaxNG.
Еще одно его ограничение заключается в том, что он не будет давать вам очень полезные сообщения об ошибках, если одно из них отсутствует.
Вместо этого вы просто получите это:
head
отсутствует обязательный экземпляр одного или нескольких из следующих дочерних элементов: meta
То есть он не будет (ну, по крайней мере, цзин) не скажет вам, что тот, кого вы пропустили, имеет 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
.
person
sideshowbarker
schedule
15.08.2017
common.attrs.rdfa.property.title
иcommon.attrs.rdfa.property.type
обязательными для элементаmeta
, потому что они оба разрешаются как атрибут с именемproperty
, но с разными значениями. А согласно спецификации RDFa атрибутproperty
может быть «термином», CURIE или абсолютным URL-адресом. Итак, вы хотите ввести более строгие ограничения и разрешитьproperty
быть толькоdct:title
илиdct:type
? - person sideshowbarker   schedule 14.08.2017