【问题标题】:Validate mixed content containing exactly one text node with RNC使用 RNC 验证仅包含一个文本节点的混合内容
【发布时间】:2014-10-20 07:07:33
【问题描述】:

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

<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 的“文本不允许”错误。将&amp; text 替换为&amp; xsd:string 可以验证无文本&lt;corner&gt;,这是我不想要的。感觉这一定很简单,我忽略了一些东西......感谢您的任何建议。

【问题讨论】:

    标签: xml validation relaxng relaxng-compact


    【解决方案1】:

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

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

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

    这向我表明,您正在运行 smack dab,以符合 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>
    

    有了这样的 rnc:

    corner = element corner {
      description,
      (
        modelSection
        & var+
        & data
      )
    }
    
    data = element data { xsd:string { minLength = "1" } }
    

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

    【讨论】:

      【解决方案2】:

      使用xsd:string 并将最小长度设置为 1 怎么样?请参阅https://stackoverflow.com/a/21709260/1712389 以获取 RNG 中的答案。

      【讨论】:

      • 感谢您的回答。正如您在最初的问题中看到的那样,我尝试过 xsd:string ,不幸的是添加 minLength 并不会改变它的有效性。我认为 Louis 是对的,RNG 不允许这种特殊结构。
      • 对。我认为问题只是定义一个非零长度的字符串。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多