Проверка смешанного содержимого, содержащего ровно один текстовый узел, с помощью 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.

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