1

我的 xs:unique 不工作。我尝试了本网站提供的各种解决方案。它们似乎都不适合我。我正在使用 C# 针对架构验证我的 xml。例如,重复密钥 passwordomni。

下面是我的架构。

<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>
4

1 回答 1

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 植根于元素,它不会符合您的期望。

在此处输入图像描述

于 2013-04-11T15:52:26.700 回答