тип данных встроенной схемы для html / xhtml - PullRequest
0 голосов
/ 18 июня 2010

Существует ли встроенный тип данных схемы для данных xhtml? Предположим, я хочу указать элемент «boozle», который содержит два «woozles», каждый из которых является произвольным xhtml. Я хочу написать что-то вроде этого, используя компактный синтаксис relax NG:

namespace nifty = "http://brinckerhoff.org/nifty/"

start = element nifty:boozle {woozle, woozle}

woozle = element nifty:woozle {xhtml}

К сожалению, xmllint сообщает об этой ошибке:

. / Lab.rng: 43: элемент ref: Ошибка синтаксического анализатора Relax-NG: Ссылочный xhtml не имеет соответствующего определения ./lab.rng:43: элемент ref: Ошибка синтаксического анализатора Relax-NG: Внутренний файл не определен для ref xhtml

Так что мой вопрос таков: есть ли что-то разумное, что я должен поставить вместо "xhtml" выше?

Ответы [ 3 ]

1 голос
/ 01 марта 2011

Пространства имен и схемы являются ортогональными в RELAX NG, тогда как они тесно связаны в XML-схеме. Если вы хотите просто проверить, что ваши элементы находятся в пространстве имен XHTML, вы можете настроить правило следующим образом:

htmlElement = element xhtml:* { (attribute * {text} | text | htmlElement)* }

в тех же строках, что и определение любого элемента выше. Но если вы действительно хотите проверить содержимое как XHTML, вам следует использовать схему RELAX NG для XHTML, включить ее (есть несколько начальных точек, в зависимости от того, хотите ли вы строгий XHTML 1.0 и т. Д.), А затем сослаться на его шаблон элемент HTML или любой другой элемент (ы), который вы хотите. Когда вы включаете полную схему в вашу собственную схему, вам нужно сказать «include» blahblah {start =}, чтобы переопределить собственный начальный символ включенной схемы.

0 голосов
/ 18 июня 2010

Аааа ... ладно, больше времени для качественного изучения документации Relax NG предлагает два возможных решения этой проблемы.

1) Используйте классы имен, чтобы указать «anyElement», который соответствует всему, например:

anyElement =
  element * {
    (attribute * { text }
     | text
     | anyElement)*
  }

Это умеренно ужасно, потому что просто отключает проверку этих элементов. Однако с этим определением я мог бы поставить «anyElement» вместо «xhtml» выше.

2) Мне кажется, что лучшим решением будет использование директивы Relax NG для включения полной спецификации xhtml, при условии, что я смогу ее найти.

0 голосов
/ 18 июня 2010

Ваши woozles и boozles находятся в вашем пространстве имен, в то время как элементы xhtml находятся в пространстве имен xhtml. Схема проверяет пространство имен a - ваша схема проверяет пространство имен, а схема xhtml проверяет пространство имен xhtml. Вы можете ограничить элемент содержанием xhtml, указав, что все его дочерние элементы находятся в пространстве имен xhtml, но ваша схема не должна проверять само пространство имен xhtml.

Вы можете использовать схему xhtml для проверки любых узлов пространства имен xhtml в вашем документе. Вы добавляете эту схему в ваш конвейер обработки, то есть второй шаг проверки.

...