使用RNC验证包含一个文本节点的混合内容

时间:2014-08-26 20:27:06

标签: xml validation relaxng relaxng-compact

我正在尝试验证应该只包含一个文本节点的混合内容元素。例如,这应验证:

<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
  )
}

(之前定义了descriptionmodelSectionvar)但在验证上面的第一个示例时,rnv报告了fff_pre_Thi_Vhi_Vhi的“文本不允许”错误。用& text代替& xsd:string验证无文字<corner>,我不想要。这样的感觉必须简单,我忽视了一些事情......感谢您的任何建议。

2 个答案:

答案 0 :(得分:2)

当我尝试使用您的架构运行jing时(在添加缺失的位并从rnc转换为rng之后),我收到此错误:

/tmp/t2/test.rng:4:28: error: interleave of "string" or "data" element

此错误对应于定义corner元素内容的rng部分。

这告诉我你正在运行轻松进入Relax NG规范的Section 7.2中指定的限制。在您的情况下,您正在尝试使用一个元素作为子元素接受其他元素和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>

这样的人:

corner = element corner {
  description,
  (
    modelSection
    & var+
    & data
  )
}

data = element data { xsd:string { minLength = "1" } }

我使用data作为元素的名称,但我希望在最终解决方案中有更具体的内容。

答案 1 :(得分:0)

如何使用xsd:string并将最小长度设置为1?有关RNG的答案,请参阅https://stackoverflow.com/a/21709260/1712389