Как игнорировать html в элементе xml при проверке с помощью Relaxng Compact

Как я могу иметь шаблон, который игнорирует html внутри элемента, а не валидатор, пытающийся проверить его

<stuff>
   <data>
      this is some text <b>with the odd</b> bit of html<p>and unclosed tags
   </data>
</stuff>

Это неверно, но я пробовал такие вещи, как

datatypes xs = "http://www.w3.org/2001/XMLSchema-datatypes"
start = stuff

stuff = element stuff
{
   element data { * }
}

person Adrian Cornish    schedule 23.05.2016    source источник


Ответы (2)


Вы не можете разрешить произвольный немодифицированный HTML в XML. Либо экранируйте отдельные специальные символы (Каковы официальные зарезервированные символы XML?) или инкапсулировать HTML в контейнер CDATA (Is можно ли вставить HTML-контент в XML-документ?).

person Rintze Zelle    schedule 23.05.2016
comment
Это не мои данные, они из внешнего источника, поэтому избежать их невозможно. - person Adrian Cornish; 24.05.2016
comment
Что ж, любой анализатор XML легко споткнется о HTML. Я думаю, вы могли бы дезинфицировать его при импорте, например. поиск и замена на основе регулярных выражений перед передачей файла парсеру XML. - person Rintze Zelle; 24.05.2016
comment
пока все хорошо - html хорош, и я добавил несколько тегов, которые используются в rnc - не идеально, но работает. - person Adrian Cornish; 24.05.2016
comment
Однако это все равно не сработает с незакрытыми тегами, верно? (см. w3.org/TR/html5/syntax.html#Optional- теги для полного списка) - person Rintze Zelle; 24.05.2016
comment
Нет, пока в 15K LOC xml, который я просмотрел, html хорошо сформирован. Я ожидаю, хотя где-то это не так - мне кажется странным, что я не могу усвоить значение элемента "как есть" - person Adrian Cornish; 24.05.2016
comment
Что ж, XML гораздо более строг, чем HTML. - person Rintze Zelle; 24.05.2016
comment
И опять же, разделы CDATA специально предназначены для того, чтобы вы могли хранить такие вещи, как необработанный HTML. См. также stackoverflow.com/questions/2784183/ что означает cdata-in-xml - person Rintze Zelle; 10.08.2016

Вы не сможете проверить XML-документ с неправильным HTML-кодом в нем, поскольку из-за неправильного формата такие документы не являются XML-документами. Но если на самом деле входные данные, которые вы получаете, представляют собой XML, то вы, безусловно, можете определить data, чтобы разрешить любые правильно сформированные элементы HTML или любой правильно сформированный XML.

Разрешение любого правильно сформированного XML является самым простым. Мы определяем шаблон, который означает «любой правильно сформированный XML здесь»: любые встречающиеся элементы проверяются с использованием одного и того же шаблона рекурсивно:

wellformed-xml = (text
                 | element * { wellformed-xml }
                 )*

Теперь определите элемент data для использования этого шаблона:

stuff = element stuff {
            element data { wellformed-xml }
        }

Если вы действительно хотите убедиться, что это просто HTML, вам понадобится класс имен, более ограничивающий, чем "*". Я заполнил его b, i, p, span и div и оставил вам в качестве упражнения, чтобы добавить другие элементы, которые вы хотите.

start = stuff
stuff =
  element stuff {
    element data { wellformed-html }
  }

wellformed-html =
  (text
   | element b | div | i | p | span { wellformed-html }
   )*

Если вы хотите также поддерживать ввод XHTML, вам нужно использовать ссылку на пространство имен; еще раз упражнение для читателя.

person C. M. Sperberg-McQueen    schedule 03.06.2016