2011-12-10 49 views
0

想象一下,我有一個basic.xsd文件,其中某些元素myElement中的某些屬性myAttribute定義爲xsd:string。現在導入後限制xsd字符串

我想導入此basic.xsd在我special.xsd並作出myAttribute定義嚴格,只允許值abanotherSpecial.xsd的其他實施者可能想要將可能的值限制爲loremipsum

這怎麼辦?我可以使屬性抽象嗎?

回答

2

屬性或元素不能被「重新定義」;所以你必須確保你的屬性是一個全局定義的簡單類型;無論屬性是否全局,它都不會有所作爲。與元素不同,屬性不能被標記爲抽象。

我會從字面上理解,您想要更改與basic.xsd中的元素關聯的屬性的值的值域,而不是別的。這是我會怎麼做:

basic.xsd

<?xml version="1.0" encoding="utf-8" ?> 
<!--XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com)--> 
<xsd:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" 
    elementFormDefault="qualified" 
    xmlns="http://tempuri.org/XMLSchema.xsd" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:element name="myElement"> 
     <xsd:complexType> 
      <xsd:simpleContent> 
       <xsd:extension base="xsd:string"> 
        <xsd:attribute name="myAttribute" type="tmyAttribute"/> 
       </xsd:extension> 
      </xsd:simpleContent> 
     </xsd:complexType> 
    </xsd:element> 

    <xsd:simpleType name="tmyAttribute"> 
     <xsd:restriction base="xsd:string"/> 
    </xsd:simpleType> 
</xsd:schema> 

有效樣本XML:

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) --> 
<myElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" myAttribute="myAttribute1" xmlns="http://tempuri.org/XMLSchema.xsd">myElement1</myElement> 

special.xsd

<?xml version="1.0" encoding="utf-8" ?> 
<!--XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com)--> 
<xsd:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" 
    elementFormDefault="qualified" 
    xmlns="http://tempuri.org/XMLSchema.xsd" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:redefine schemaLocation="basic.xsd"> 
     <xsd:simpleType name="tmyAttribute"> 
      <xsd:restriction base="tmyAttribute"> 
       <xsd:enumeration value="a"/> 
       <xsd:enumeration value="b"/> 
      </xsd:restriction> 
     </xsd:simpleType>  
    </xsd:redefine> 
</xsd:schema> 

當對special.xsd驗證,上面的XML現在是無效的;將示例XML中的myAttribute屬性值更改爲a,並且它將起作用。

如果使用此XSD的用戶在重新定義時遇到問題,例如將XSD綁定到代碼的工具,然後我會看看一個XML Schema重構工具,該工具可以接受您的special.xsd並自動轉​​換爲其等效格式,而不需要xsd:redefine。實際上你要做的是將special.xsd中的「知識產權」與basic.xsd分開;而對basic.xsd的更改可以自動保留並使special.xsd的用戶可見,而無需一次又一次「重新編碼」XSD ...