xs:unique和xs:substitutionGroup

时间:2010-12-17 21:45:26

标签: xml xsd

我在架构中有一个 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>

我不是那么想的。我希望唯一密钥在替换中持续存在......是否可能?如果不是,那会有什么变通方法呢?

感谢。

2 个答案:

答案 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>