XML中的唯一属性值

时间:2014-01-07 21:15:34

标签: xml

我是XML / XSD的新手,虽然有许多类似的相关问题,但我仍然无法使其工作。如果这个问题重复了之前的问题,我很抱歉。

我正在努力使属性的唯一值工作,但无法使其工作。

下面是我的架构和相应的XML文件。

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.dolby.com/MY" targetNamespace="http://www.dolby.com/MY" xmlns="http://www.dolby.com/MY">

<xs:element name="MYCfg">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="Section" maxOccurs="unbounded" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="SubSection" maxOccurs="unbounded" minOccurs="0">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="Param" type="ParamType" maxOccurs="unbounded" minOccurs="0">

                  </xs:element>
                </xs:sequence>
                <xs:attribute type="xs:string" name="name" use="required"/>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
          <xs:attribute type="xs:string" name="name" use="required"/>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  <xs:key name="ParamId">
    <xs:selector xpath="xs:Section/SubSection/Param"/>
    <xs:field xpath="@ID"/>
  </xs:key>
  <xs:unique name="ParamIdUnique">
    <xs:selector xpath="xs:Section/SubSection/Param"/>
    <xs:field xpath="@ID"/>
  </xs:unique>
</xs:element>

<xs:complexType name="ParamType">
  <xs:sequence>
    <xs:element type="xs:string" name="Value"/>
  </xs:sequence>
    <xs:attribute type="xs:string" name="name" use="required"/>
    <xs:attribute type="xs:int" name="ID" use="required"/>
</xs:complexType>

</xs:schema>



<?xml version="1.0"?>
<tns:MYCfg xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.dolby.com/MY">

<tns:Section name="Network">
  <tns:SubSection name="DHCP">
    <tns:Param name="ip_address" ID="12345">
      <tns:Value>10.10.10.1</tns:Value>
    </tns:Param>
    <tns:Param name="subnet" ID="12345">
      <tns:Value>10.10.10.1</tns:Value>
    </tns:Param>
  </tns:SubSection>

<tns:SubSection name="Provisioning">
  <tns:Param name="ip_address" ID="12345">
    <tns:Value>10.10.10.1</tns:Value>
  </tns:Param>
  </tns:SubSection>

</tns:Section>

<tns:Section name="PBX">
  <tns:SubSection name="SIP">
  <tns:Param name="username" ID="12345">
    <tns:Value>user</tns:Value>
  </tns:Param>
  </tns:SubSection>
</tns:Section>

</tns:MYCfg>

1 个答案:

答案 0 :(得分:0)

您需要在XPath表达式中一致地使用前缀,即代替

  <xs:unique name="ParamIdUnique">
    <xs:selector xpath="xs:Section/SubSection/Param"/>
    <xs:field xpath="@ID"/>
  </xs:unique>

你需要

  <xs:unique name="ParamIdUnique">
    <xs:selector xpath="tns:Section/tns:SubSection/tns:Param"/>
    <xs:field xpath="@ID"/>
  </xs:unique>