2012-06-07 36 views
2

我有一個XSD文件,我已經定義了一個類似於這樣的枚舉限制的簡單類型。在正則表達式中使用枚舉限制類型

<xs:simpleType name="myEnumStrings"> 
    <xs:restriction base="xs:string"> 
     <xs:enumeration value="first"/> 
     <xs:enumeration value="second"/> 
     ... 
     <xs:enumeration value="last"/> 
    </xs:restriction> 
</xs:simpleType> 

我有一個第二簡單類型,它的值取決於在複雜的方式myEnumStrings的可能值,我可以帶有圖案只描述。

<xs:simpleType name="patternRestrictedType"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value="..."/> 
    </xs:restriction> 
</xs:simpleType> 

目前我使用字符串

(first|second|...|last) 

每當我想指的是myEnumStrings複製在正則表達式的信息。這雖然是一個麻煩製造者和錯誤的來源,因爲當我修改myEnumStrings類型時,我需要保持所有正則表達式都是最新的。

有沒有辦法在正則表達式中引用myEnumStrings的可能值來避免這種重複?如果這是不可能的,是否有辦法定義globaly字符串(第一|第二| ... |最後)在正則表達式中重用,以限制重複僅在兩個地方,並使正則表達式更具可讀性?

回答

2

XSD並不擅長它,就像「優雅」一樣。唯一可能幫助的是使用工會;它會基於你的特定模式工作,但它可能無法基於你沒有描述的其他東西工作。

這個想法是重用枚舉。爲此,您可以創建簡單類型來封裝您希望重用的枚舉。只是一個觀察,具有多個枚舉值在技術上等同於其值的分離(按照模式)。

<?xml version="1.0" encoding="utf-8" ?> 
<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:simpleType name="myEnumStrings-1"> 
     <xsd:restriction base="xsd:string"> 
      <xsd:enumeration value="first"/> 
     </xsd:restriction> 
    </xsd:simpleType> 
    <xsd:simpleType name="myEnumStrings-2"> 
     <xsd:restriction base="xsd:string"> 
      <xsd:enumeration value="second"/> 
     </xsd:restriction> 
    </xsd:simpleType> 
    <xsd:simpleType name="myEnumStrings-n"> 
     <xsd:restriction base="xsd:string"> 
      <xsd:enumeration value="last"/> 
     </xsd:restriction> 
    </xsd:simpleType> 

    <xsd:simpleType name="myEnumStrings"> 
     <xsd:union memberTypes="myEnumStrings-1 myEnumStrings-2 myEnumStrings-n"/> 
    </xsd:simpleType> 

    <xsd:simpleType name="patternRestrictedType"> 
     <xsd:union memberTypes="myEnumStrings-1 myEnumStrings-2"/> 
    </xsd:simpleType> 

    <xsd:element name="root-a" type="myEnumStrings"/> 
    <xsd:element name="root-b" type="patternRestrictedType"/> 
</xsd:schema> 

上面實現了枚舉的重用,或者您爲聯合成員定義的任何其他約束。

有效的XML根 - 一個:

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

根-B有效的XML:

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

雖然根-B的內容會爲工作根一中,反之則不然。

正如我所說過的,當你認爲大套時可能不那麼優雅;但是,它應該嚴格回答我認爲你所問的問題,並可能會爲您提供其他方法的指引。

+0

謝謝你的回答。我想要做的事情遠比制定限制某些枚舉值的模式複雜得多。我想要的是使用正則表達式,如「[0-9] +(myEnumStrings)( - (myEnumStrings))*」。它開始看起來不可能用XML Schema。 – user1441798

+1

那,沒辦法! –

+0

是的,這就是我所害怕的。謝謝你確認。 – user1441798