2010-06-18 3 views
0

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

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

start = element nifty:boozle {woozle, woozle} 

woozle = element nifty:woozle {xhtml} 

К сожалению, xmllint затем сигнализирует эту ошибку:

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

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

ответ

0

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

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

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

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

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

+0

Считаете ли я очень плохую форму, чтобы дать мне кредит на ответ здесь? –

+0

Лучшим решением является использование XML-конвейера с несколькими валидаторами схемы, один для вашего пространства имен и один для пространства имен xhtml. Я ссылаюсь на схему xhtml в комментариях к ответам. – mdma

+0

Это может показаться невежеством или упрямством, но мне непонятно, как перевести свое предложение в декларативное решение. Проще говоря: предлагаете ли вы способ написать спецификацию Relax NG таким образом, чтобы я мог использовать jing или xmllint или другой подобный инструмент для проверки моего xml или вы предлагаете что-то более сложное? BTW: Большое спасибо за ваше время. –

0

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

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

+0

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

+0

Проверка выполняется в двух частях: в отличной схеме , вы говорите, что дети woozle находятся в пространстве имен xhtml.Затем вы также используете схему xhtml (http://www.w3.org/TR/xhtml1-schema/) для проверки узлов xhtml. Я предполагаю, что самый простой способ сделать это - использовать конвейер xml с двумя проходами проверки схемы - один для красивой схемы relaxng и один для схемы xhtml w3c. – mdma

+0

Ург ... так близко. Чтобы вернуться к моему первоначальному вопросу: * what * я помещаю в схему Relax NG, чтобы указать, что дети woozle находятся в пространстве имен xhtml? Я просто попробовал несколько разумных догадок, без успеха. В частности, я считаю, что мне действительно здесь нужна ссылка на тип данных a la xsd. –

1

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

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

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

+0

Спасибо! Имеет смысл. –

Смежные вопросы