2013-08-18 114 views
2

我想要一個XSD來確定一個包含多個別名但每個別名具有不同值的文件元素的XML。XSD序列中的唯一元素

這是我的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 =別名2

我怎麼能在我的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元素文本值的屬性。

回答

5

如果我明白你的需要,那麼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> 
+0

大,它的工作原理。我見過一些樣本[鏈接](http://stackoverflow.com/questions/5541305/xml-xsd-schema-enforce-unique-attribute-values-in-schema),但我不知道如何指定值而不是屬性。謝謝! – sergio