Как добавить новые значения мета-свойств в 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 приписывать.

Другие вопросы по тегам