我有这个模式触发了Unique Particle Attribution违规。我明白为什么,但我没有看到任何其他表达方式。架构是:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Root">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element name="Element" minOccurs="1" maxOccurs="unbounded">
<xs:complexType mixed="true">
<xs:attribute name="First" use="required"/>
<xs:attribute name="SomeAttribute" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="Element" minOccurs="0" maxOccurs="1">
<xs:complexType mixed="true">
<xs:attribute name="Second" use="required"/>
<xs:attribute name="SomeOtherAttribute" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
以及它应该验证的XML:
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<Element First="true" SomeAttribute="abc"/>
<Element Second="true" SomeOtherAttribute="def"/>
</Root>
我不想简化架构,这意味着我不想让任何属性选项,或允许属性之间的混合...另外我不能将“元素”的名称更改为某些内容比如“FirstElement”,“SecondElement”。 在XSD中可以解决这个问题吗?
感谢您的帮助!
答案 0 :(得分:2)
架构的问题在于,您已使用不同的属性两次赋予元素两次。这在XSD中是不允许的。
从概念上讲,XSD以这种方式工作的原因是你应该给出一个带有类型的元素,但你有两个不兼容的类型到同一个元素。
例如:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Root">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element name="FirstElement" minOccurs="1" maxOccurs="unbounded">
<xs:complexType mixed="true">
<xs:attribute name="First" use="required" />
<xs:attribute name="SomeAttribute" use="required" />
</xs:complexType>
</xs:element>
<xs:element name="SecondElement" minOccurs="0" maxOccurs="1">
<xs:complexType mixed="true">
<xs:attribute name="Second" use="required" />
<xs:attribute name="SomeOtherAttribute" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
这应该允许XML验证
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<FirstElement First="true" SomeAttribute="abc"/>
<SecondElement Second="true" SomeOtherAttribute="def"/>
</Root>
答案 1 :(得分:1)
您可以使用条件类型分配在XSD 1.1中执行此操作。 Saxon和Xerces目前支持XSD 1.1。
答案 2 :(得分:1)
没有办法完全你想要的东西;你能做的最好就是接受权衡。例如,如果第一个<Element>
发生了固定次数(不是变量),它就会起作用 - 这不是你想要的。
只是为了说明:
$ cat upa.xsd
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Root">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element name="Element" minOccurs="1" maxOccurs="1"> <!-- CHANGE -->
<xs:complexType mixed="true">
<xs:attribute name="First" use="required"/>
<xs:attribute name="SomeAttribute" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="Element" minOccurs="0" maxOccurs="1">
<xs:complexType mixed="true">
<xs:attribute name="Second" use="required"/>
<xs:attribute name="SomeOtherAttribute" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
$ cat upa.xml
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<Element First="true" SomeAttribute="abc"/>
<Element Second="true" SomeOtherAttribute="def"/>
</Root>
$ xmllint --schema upa.xsd upa.xml --noout
upa.xml validates
答案 3 :(得分:0)
对于某些人来说,解决方案可能非常简单:
确保所有具有相同名称的元素(兄弟姐妹)使用相同的属性。
例如改变这个:
<g:FlowPanel addStyleNames="widget-wrap"/>
<g:FlowPanel styleName="widget-wrap"/>
对此:
<g:FlowPanel addStyleNames="widget-wrap"/>
<g:FlowPanel addStyleNames="widget-wrap"/>