Как добавить новые значения мета-свойств в rdfa.rnc

В схеме компактного синтаксиса RelaxNG здесь:

https://github.com/validator/validator/blob/master/schema/html5/rdfa.rnc#L51

… Я хотел бы отредактировать с некоторым фиксированным значением свойства атрибута rdfa в элементе 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?

Я получаю сообщение об ошибке при попытке добавить эти ..


person VSr    schedule 09.08.2017    source источник
comment
@sideshowbarker Это выполнимо?   -  person VSr    schedule 10.08.2017
comment
Да, но у меня еще не было времени вникнуть в это. Я надеялся, что кто-то еще со знанием RelaxNG сможет вмешаться и дать ответ. Но если никто не сделает этого в ближайшее время, я найду время ответить на него.   -  person sideshowbarker    schedule 10.08.2017
comment
Какую ошибку вы получаете? Вы не можете сделать 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
comment
@sideshowbarker, два метаэлемента должны быть обязательными с единственными параметрами dct:title и dct:type. При объявлении этого я получаю что-то вроде ошибки данных и строки...   -  person VSr    schedule 15.08.2017


Ответы (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#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
comment
да это то, что ожидалось. Я тоже столкнулся с трудностями при чередовании свойств и понял ограничения RNC. Большое спасибо.. - person VSr; 16.08.2017