4

我想要一个 XSD 来验证一个包含具有许多别名但每个别名具有不同值的文件元素的 XML。

这是我的 XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<folder>
  <files>
    <fileList>
      <file>
        <title>Document1</title>
        <fileAlias>
          <alias>Alias1</alias>
          <alias>Alias2</alias>
        </fileAlias>
      </file>
    </fileList>
  </files>
</folder>

以前的 XML 很好,因为 Alias1 != Alias2

我如何在我的 XSD 中指定它:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="folder" type="folderType" />
  <xs:complexType name="folderType">
    <xs:sequence>
      <xs:element name="files" type="filesType" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="filesType">
    <xs:sequence>
      <xs:element name="fileList" type="fileListType" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="fileListType">
    <xs:sequence>
      <xs:element maxOccurs="unbounded" name="file" type="fileType" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="fileType">
    <xs:sequence>
      <xs:element name="title" type="xs:string" />
      <xs:element name="fileAlias" type="fileAliasType" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
    <xs:attribute name="id" type="xs:string" />
    <xs:attribute name="type" type="xs:int" />
  </xs:complexType>
  <xs:complexType name="fileAliasType">
    <xs:sequence>
      <xs:element maxOccurs="unbounded" name="alias" type="xs:string" minOccurs="1" />
    </xs:sequence>
  </xs:complexType>
</xs:schema>

我已经尝试过,xsd:unique但我认为是用于属性而不是 XML 元素文本值。

4

1 回答 1

9

如果我很了解您的需求,那么 xs:unique 应该是正确的方法。修改 fileType 复杂类型应该足够了。

<xs:complexType name="fileType">
    <xs:sequence>
        <xs:element name="title" type="xs:string"/>
        <xs:element name="fileAlias" type="fileAliasType" minOccurs="0" maxOccurs="unbounded">
            <xs:unique name="alias_unique">
                <xs:selector xpath="alias"/>
                <xs:field xpath="."/>
            </xs:unique>
        </xs:element>
    </xs:sequence>
    <xs:attribute name="id" type="xs:string"/>
    <xs:attribute name="type" type="xs:int"/>
</xs:complexType>

这将验证

<?xml version="1.0" encoding="UTF-8"?>
<!--Sample XML file generated by XMLSpy v2013 sp1 (http://www.altova.com)-->
<folder xsi:noNamespaceSchemaLocation="unique.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <files>
        <fileList>
            <file id="String" type="0">
                <title>String</title>
                <fileAlias>
                    <alias>String1</alias>
                    <alias>String2</alias>
                    <alias>String3</alias>
                </fileAlias>
            </file>
        </fileList>
    </files>
</folder>

这不会

<?xml version="1.0" encoding="UTF-8"?>
<!--Sample XML file generated by XMLSpy v2013 sp1 (http://www.altova.com)-->
<folder xsi:noNamespaceSchemaLocation="unique.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <files>
        <fileList>
            <file id="String" type="0">
                <title>String</title>
                <fileAlias>
                    <alias>String1</alias>
                    <alias>String1</alias>
                    <alias>String3</alias>
                </fileAlias>
            </file>
        </fileList>
    </files>
</folder>
于 2013-08-18T14:56:46.203 回答