警告:不能代表可选的属性组;逼近

时间:2014-05-27 13:54:20

标签: xml angularjs lxml relaxng

我收到此警告"警告:不能代表可选的属性组;近似"使用trang将以下Relax NG模式转换为XML模式。我不确定为什么会出现这个警告。这与属性的排序有关吗?请建议一种方法来克服这个问题。

<define name="Relation">
    <element name="constraint">
      <attribute name="name">
        <data type="string"/>
      </attribute>
      <optional>
        <attribute name="relation">
          <choice>
            <value>&lt;&lt;</value>
            <value>&lt;=</value>
            <value>=</value>
            <value>&gt;=</value>
            <value>&gt;&gt;</value>
          </choice>
        </attribute>
        <attribute name="version">
          <ref name="VirtualVersion"/>
        </attribute>
      </optional>
    </element>
  </define>

1 个答案:

答案 0 :(得分:0)

这里的问题是XML Schema(xsd)不允许您将属性可选作为一个组。 Relax NG模式试图指定如果relation存在,则version也必须存在,或者它们必须都不存在。你不能没有另一个。 XML Schema 1.0无法表示这一点,因此trang概括为允许一个没有另一个的模式。 (在XSD 1.1中,可以使用断言或条件类型赋值来实现此效果,但是trang写入1.0而不是1.1 XSD架构。)

如果您只想让警告消失,您可以将Relax NG更改为:

<define name="Relation">
  <element name="constraint">
    <attribute name="name">
      <data type="string"/>
    </attribute>
    <optional>
      <attribute name="relation">
        <choice>
          <value>&lt;&lt;</value>
          <value>&lt;=</value>
          <value>=</value>
          <value>&gt;=</value>
          <value>&gt;&gt;</value>
        </choice>
      </attribute>
    </optional>
    <optional>
      <attribute name="version">
        <ref name="VirtualVersion"/>
      </attribute>
    </optional>
  </element>
</define>

复制trang在概括架构时所执行的操作。无论何时应用程序将在验证后接收数据,都必须执行检查以确保versionrelation存在,如果其中一个存在的话。{/ p>

另一种方法是,如果可以更改原始Relax NG架构中的属性数量和类型,则可以将relationversion合并为一个然后应用程序必须解析的单个属性。因此,relation='=' version='1.0'代替version='=1.0'而不是version。接收此功能的应用程序必须将=的值分隔为1.0和{{1}}。