我在架构中有一个 xs:unique 声明。它运作良好。但是当我替换一个关键元素时,它就不再起作用了。
是否有某些东西可以确保唯一密钥与替换一起存在?
例如,我有这个xml:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<el id="1"/>
<el id="2"/>
</root>
和这个架构:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="typeel">
<xs:attribute name="id"/>
</xs:complexType>
<xs:element name="el" type="typeel"/>
<xs:element name="root">
<xs:complexType>
<xs:sequence maxOccurs="unbounded">
<xs:element ref="el"/>
</xs:sequence>
</xs:complexType>
<xs:unique name="idgoooood">
<xs:selector xpath="el"/>
<xs:field xpath="@id"/>
</xs:unique>
</xs:element>
</xs:schema>
这项工作非常好。
但是,如果我添加架构:
<xs:element name="el-bis" type="typeel" substitutionGroup="el"/>
我可以写我的xml:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<el id="1"/>
<el id="2"/>
<el-bis id="3"/>
</root>
非常好。但是,不幸的是,我也可以写:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<el id="1"/>
<el id="2"/>
<el-bis id="2"/>
</root>
我不是那么想的。我希望唯一密钥在替换中持续存在......是否可能?如果不是,那会有什么变通方法呢?
感谢。
答案 0 :(得分:0)
我认为这是不可能的。您必须将唯一声明复制到替换元素。
答案 1 :(得分:0)
这可能是我回答的最古老的问题,因此,我可以肯定地说,您不再关心解决方案了,但是如果像我这样的人来这里寻找答案,您就可以...
亲密无间,您只需要更改唯一约束中的选择器,使其不仅匹配el,还可以应用约束,无论您在replaceGroup中使用哪个元素。
<xs:unique name="idgoooood">
<xs:selector xpath="*"/>
<xs:field xpath="@id"/>
</xs:unique>
完整的Xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="typeel">
<xs:attribute name="id"/>
</xs:complexType>
<xs:element name="el" type="typeel"/>
<xs:element name="el-bis" type="typeel" substitutionGroup="el"/>
<xs:element name="root">
<xs:complexType>
<xs:sequence maxOccurs="unbounded">
<xs:element ref="el"/>
</xs:sequence>
</xs:complexType>
<xs:unique name="idgoooood">
<xs:selector xpath="*"/>
<xs:field xpath="@id"/>
</xs:unique>
</xs:element>
</xs:schema>
示例Xml:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<el id="1"/>
<el id="2"/>
<el-bis id="2" /> <!-- Fails due to duplication -->
</root>