2013-04-11 54 views
1

我的xs:unique不起作用。我尝试了这个网站提供的各种解决方案。他们似乎都没有为我工作。我正在使用C#根据模式验证我的xml。例如重复键密码。问题与xml xs:独特

下面是我的模式。

<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mstns="http://tempuri.org/SqlManifest.xsd"> 
    <xs:element name="sqlmanifest"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="sqlparameters" maxOccurs="1" minOccurs="0"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="sqlparameter" maxOccurs="unbounded" minOccurs="0"> 
       <xs:complexType> 
        <xs:simpleContent> 
        <xs:extension base="xs:string"> 
         <xs:attribute type="xs:string" name="key" use="required"/> 
         <xs:attribute type="xs:string" name="description" use="required"/> 
        </xs:extension> 
        </xs:simpleContent> 
       </xs:complexType> 
       <xs:unique name="unique-key"> 
        <xs:selector xpath ="mstns:sqlparameter"/> 
        <xs:field xpath="@key"/> 
       </xs:unique> 
       </xs:element> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     <xs:element name="sqlcommands" maxOccurs="1" minOccurs="1"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="sqlcommand" maxOccurs="unbounded" minOccurs="1"> 
       <xs:complexType> 
        <xs:simpleContent> 
        <xs:extension base="xs:string"> 
         <xs:attribute type="xs:string" name="path" use="required"/> 
        </xs:extension> 
        </xs:simpleContent> 
       </xs:complexType> 
       <xs:unique name="unique-path"> 
        <xs:selector xpath ="mstns:sqlcommand"/> 
        <xs:field xpath="@path"/> 
       </xs:unique> 
       </xs:element> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
     <xs:attribute type="xs:boolean" name="transactional"/> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

下面是我的XML

<sqlmanifest transactional="false"> 
    <sqlparameters> 
     <sqlparameter key="dbpath" description="Please enter dbpath"/> 
     <sqlparameter key="passworduserOmni" description="Please enter password for OmniUser"/> 
     <sqlparameter key="passwordadminOmni" description="Please enter password for OmniAdminUser"/> 
       <sqlparameter key="passwordadminOmni" description="Please enter password for OmniAdminUser"/> 
    </sqlparameters> 
    <sqlcommands> 
     <sqlcommand path="scripts/script1.sql"/> 
     <sqlcommand path="scripts/script2.sql" /> 
     <sqlcommand path="scripts/scripts3.sql" /> 
     <sqlcommand path="scripts/scripts4.sql" /> 
       <sqlcommand path="scripts/script1.sql"/> 
    </sqlcommands> 
</sqlmanifest> 

回答

2

您的XML不使用命名空间,所以你的XSD应该没有目标命名空间,所以你不能在你的XPath(字段/选择器)使用任何前缀。

限制必须放在适当的水平。所以你的unique-key必须在sqlparametersunique-pathsqlcommands下移动。

你纠正XSD如下:

<?xml version="1.0" encoding="utf-8" ?> 
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) --> 
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mstns="http://tempuri.org/SqlManifest.xsd"> 
    <xs:element name="sqlmanifest"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="sqlparameters" maxOccurs="1" minOccurs="0"> 
        <xs:complexType> 
         <xs:sequence> 
          <xs:element name="sqlparameter" maxOccurs="unbounded" minOccurs="0"> 
           <xs:complexType> 
            <xs:simpleContent> 
             <xs:extension base="xs:string"> 
              <xs:attribute type="xs:string" name="key" use="required"/> 
              <xs:attribute type="xs:string" name="description" use="required"/> 
             </xs:extension> 
            </xs:simpleContent> 
           </xs:complexType> 
          </xs:element> 
         </xs:sequence> 
        </xs:complexType> 
        <xs:unique name="unique-key"> 
         <xs:selector xpath ="sqlparameter"/> 
         <xs:field xpath="@key"/> 
        </xs:unique> 
       </xs:element> 
       <xs:element name="sqlcommands" maxOccurs="1" minOccurs="1"> 
        <xs:complexType> 
         <xs:sequence> 
          <xs:element name="sqlcommand" maxOccurs="unbounded" minOccurs="1"> 
           <xs:complexType> 
            <xs:simpleContent> 
             <xs:extension base="xs:string"> 
              <xs:attribute type="xs:string" name="path" use="required"/> 
             </xs:extension> 
            </xs:simpleContent> 
           </xs:complexType> 
          </xs:element> 
         </xs:sequence> 
        </xs:complexType> 
        <xs:unique name="unique-path"> 
         <xs:selector xpath ="sqlcommand"/> 
         <xs:field xpath="@path"/> 
        </xs:unique> 
       </xs:element> 
      </xs:sequence> 
      <xs:attribute type="xs:boolean" name="transactional"/> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

如果你之前和之后可视化的约束,它会帮助你理解为什么范围应该是这个样子;另外,考虑到选择器的xpath根源于元素,它不会按照您的期望匹配。

enter image description here