Как добавить новые значения мета-свойств в rdfa.rnc
В схеме синтаксиса 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
список?
Я получаю сообщение об ошибке при попытке добавить эти..
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=…>
элемент - и в этом порядке- вызовет ошибку.
Поэтому самое большое ограничение в том, что вы не можете использовать чередование (&
) но вместо этого вам нужно требовать конкретного заказа для meta
элементы.
Причиной этого является то, что уже объяснялось в вопросах Interleave In RNC и Может ли relaxng указывать неупорядоченный набор элементов с одинаковыми именами, но разными атрибутами? и на https://www.oasis-open.org/committees/relax-ng/spec-20011203.html:
Суть этого в том, что существует запрет на чередование определений для элементов с одинаковыми именами, и это преднамеренное ограничение дизайна, добавленное в 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
То есть, он не будет (ну, по крайней мере, Цзин не будет) говорить вам, что тот, кого вы пропустили, имеет 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
приписывать.