我收到此警告"警告:不能代表可选的属性组;近似"使用trang将以下Relax NG模式转换为XML模式。我不确定为什么会出现这个警告。这与属性的排序有关吗?请建议一种方法来克服这个问题。
<define name="Relation">
<element name="constraint">
<attribute name="name">
<data type="string"/>
</attribute>
<optional>
<attribute name="relation">
<choice>
<value><<</value>
<value><=</value>
<value>=</value>
<value>>=</value>
<value>>></value>
</choice>
</attribute>
<attribute name="version">
<ref name="VirtualVersion"/>
</attribute>
</optional>
</element>
</define>
答案 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><<</value>
<value><=</value>
<value>=</value>
<value>>=</value>
<value>>></value>
</choice>
</attribute>
</optional>
<optional>
<attribute name="version">
<ref name="VirtualVersion"/>
</attribute>
</optional>
</element>
</define>
复制trang
在概括架构时所执行的操作。无论何时应用程序将在验证后接收数据,都必须执行检查以确保version
和relation
存在,如果其中一个存在的话。{/ p>
另一种方法是,如果可以更改原始Relax NG架构中的属性数量和类型,则可以将relation
和version
合并为一个然后应用程序必须解析的单个属性。因此,relation='=' version='1.0'
代替version='=1.0'
而不是version
。接收此功能的应用程序必须将=
的值分隔为1.0
和{{1}}。