2012-06-12 61 views
0

說明我的問題的最佳方式是發佈我目前擁有的xsd的一些片段;它會讓你更容易理解我的問題。在枚舉列表上實現XOR

這是我目前xsd文件的一些片段:

<xs:element name="RiskAnalysis"> 
<xs:complexType> 
    <xs:sequence>   
    <xs:element ref="RiskRating" maxOccurs="unbounded"/> 
    </xs:sequence> 
... 
... 
</xs:complexType> 
</xs:element> 

<xs:element name="RiskRating"> 
<xs:complexType> 
    ... 
    <xs:attribute name="RatingType" use="required"> 
<xs:simpleType> 
     <xs:restriction base="xs:NMTOKEN"> 
     <xs:enumeration value="LocationNeighbourhood"/> 
     <xs:enumeration value="Land"/> 
     <xs:enumeration value="Improvements"/> 
     <xs:enumeration value="Environmental"/> 
     <xs:enumeration value="MarketSegment"/> 
     <xs:enumeration value="ReducedValue"/> 
     <xs:enumeration value="RecentMarket"/>   
     <xs:enumeration value="LocalEconomy"/> 
     <xs:enumeration value="MarketVolatility"/> 
     <xs:enumeration value="Other"/> 
     </xs:restriction> 
    </xs:simpleType> 
    </xs:attribute> 
... 
</xs:complexType> 
</xs:element> 

我遇到的問題是,我需要限制我的xsd,這樣我創建元素之間的RiskRatings的XOR其中RatingTypeReducedValueRecentMarketValue,但我想不出辦法做到這一點。

它最好通過示例所描述的,因此這裏的一些樣品RiskAnalysis元素(xsd僞代碼)我可能得到:

可接受的(即既不的ReducedValueRecentMarket傳遞英寸):

<RiskAnalysis> 
    <RiskRating RatingType="Land" /> 
    <RiskRating RatingType="Other" /> 
</RiskAnalysis> 

可接受的(即只ReducedValue傳遞。):

<RiskAnalysis> 
    <RiskRating RatingType="Land" /> 
    <RiskRating RatingType="Other" /> 
    <RiskRating RatingType="ReducedValue" /> 
</RiskAnalysis> 

可接受的(即只RecentMarket傳遞):

<RiskAnalysis> 
    <RiskRating RatingType="Land" /> 
    <RiskRating RatingType="Other" /> 
    <RiskRating RatingType="RecentMarket" /> 
</RiskAnalysis> 

Unacceptaple,應該拋出一個架構驗證錯誤(即。既RecentMarketReducedValue傳遞):

<RiskAnalysis> 
    <RiskRating RatingType="Land" /> 
    <RiskRating RatingType="Other" /> 
    <RiskRating RatingType="RecentMarket" /> 
    <RiskRating RatingType="ReducedValue" /> 
</RiskAnalysis> 

任何人有任何想法,我會怎麼做呢?

回答

1

它不可能與XSD(單獨)!!

解決方法解決方案:許多人需要使用HOST CODE才能評估此部件。正在調用像C#,CPP,JAVA等XSD驗證的主機程序能夠驗證這些類型的條件。

0

最簡單的方法是消除分析模式中隱含的域的不一致性:一方面,您希望爲驗證目的對待類型爲RecentMarket和類型爲ReducedValue的風險評級進行不同處理,另一方面,你給他們相同的元素類型,它隱含地說,爲了驗證目的,他們應該被視爲相同。一樣?或不同?選擇。

給定的元素類型RecentMarketRating,ReducedValueRating和OtherRiskRating,是微不足道的解決您的問題。給定一個XML編碼,它將它們全部調用到同一件事物上,除了XSD 1.0之外,您的主要選項還包括用於驗證的非XSD代碼,XSD 1.1和條件類型分配或斷言的使用,或者Schematron。