Проверка смешанного содержимого, содержащего ровно один текстовый узел, с помощью RNC
Я пытаюсь проверить смешанный элемент контента, который должен содержать ровно один текстовый узел. Например, это должно подтвердить:
<corner description="ff models, bc RC; high temperature,high vdd">
<modelSection>fff_pre</modelSection>
<var value="high">temperature</var>
<var value="high">vdd</var>
fff_pre_Thi_Vhi_Vhi
</corner>
но это не должно
<corner description="ff models, bc RC; high temperature,high vdd">
<modelSection>fff_pre</modelSection>
<var value="high">temperature</var>
<var value="high">vdd</var>
<!-- no text, invalid! -->
</corner>
Я старался
corner = element corner {
description,
(
modelSection
& var+
& xsd:string
)
}
(где description
, modelSection
а также var
определены ранее), но при проверке первого примера, приведенного выше, rnv сообщает об ошибке "текст не разрешен" для fff_pre_Thi_Vhi_Vhi. Подставляя & text
за & xsd:string
проверяет без текста <corner>
что я не хочу. Похоже, это должно быть просто, и я что-то упускаю... Спасибо за любой совет.
2 ответа
Когда я пытаюсь бежать jing
с вашей схемой (после добавления недостающих битов и преобразования из rnc в rng) я получаю эту ошибку:
/tmp/t2/test.rng:4:28: error: interleave of "string" or "data" element
Эта ошибка соответствует той части rng, которая определяет содержимое corner
элемент.
Это говорит мне о том, что вы используете smack dab для ограничения, указанного в Разделе 7.2 спецификации Relax NG. В вашем случае вы пытаетесь иметь элемент, который будет принимать в качестве дочерних элементов другие элементы и data
шаблон. Спецификация не позволяет этого.
Если вы генерируете XML, вы можете решить эту проблему, создав такую структуру:
<corner description="ff models, bc RC; high temperature,high vdd">
<modelSection>fff_pre</modelSection>
<var value="high">temperature</var>
<var value="high">vdd</var>
<data>fff_pre_Thi_Vhi_Vhi</data>
</corner>
С rnc вот так:
corner = element corner {
description,
(
modelSection
& var+
& data
)
}
data = element data { xsd:string { minLength = "1" } }
я использовал data
как имя элемента, но я бы хотел что-то более конкретное, чем это в конечном решении.
Как насчет использования xsd:string
и установка минимальной длины 1? См. /questions/38211054/proverka-dlinyi-jing-relaxng-dlya-stroki/38211071#38211071 для ответа в RNG.