Создание сложного атрибута Relax NG без использования шаблона?

У меня есть атрибут под названием "страница". Он состоит из двух-трех двойных, разделенных запятыми, а не пробелами, с необязательным знаком '!' в конце. Все следующие действительны:

page="8.5,11,3!"
page="8.5,11.4,3.1"
page="8.5,11!"
page="8.5,2.1"

Я знаю, что мог бы использовать шаблоны, сработало бы следующее:

attribute page { xsd:string { pattern="[0-9]+(\.[0-9]+)?,[0-9]+(\.[0-9]+)(,[0-9]+(\.[0-9]+)?)?(!)?" } }

Но если возможно, я бы лучше использовал что-то вроде этого:

attribute page { xsd:double, ",", xsd:double, ( ",", xsd:double )?, ("!")? }

Я могу сделать вышеупомянутую сортировку, используя 'list':

attribute page { list { xsd:double, ",", xsd:double, ( ",", xsd:double )?, ("!")? } }

Но тогда я получаю пробелы между каждой частью:

page="8.5 , 11 !"

Есть ли способ сделать это без использования шаблона?

1 ответ

Решение

У Relax NG нет особых правил определения простых типов; он предназначен для использования простых библиотек типов, которые создают такие правила. Итак, в принципе, да, вы можете делать то, что вам нравится в Relax NG: просто используйте простую библиотеку типов, которая обеспечивает нужную вам функциональность.

На практике вы, похоже, используете библиотеку XSD простых типов. И хотя XSD позволяет определять типы списков, значения которых являются последовательностями других простых значений, для простоты определения и валидатора значения списка XSD разбиваются парсером на пустом пространстве; XSD не допускает произвольных разделителей для значений. Таким образом, нет, вы не можете делать то, что, как вы говорите, вы хотели бы сделать с помощью библиотеки простых типов Relax NG на основе XSD.

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