在枚举列表上实现XOR

时间:2012-06-12 02:31:46

标签: xsd xor xsd-validation

说明我的问题的最好方法是发布我目前拥有的xsd的一些片段;它会让你更容易理解我的问题。

以下是我当前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,以便在RiskRatingsRatingType和{ReducedValue的元素之间为RecentMarketValue创建XOR。 {1}},但我想不出办法做到这一点。

最好通过示例进行描述,因此我可能会收到一些示例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>

不接受并且应该抛出架构验证错误(即传入RecentMarketReducedValue):

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

有人知道我会怎么做吗?

2 个答案:

答案 0 :(得分:1)

XSD(单独)不可能!!

变通方法解决方案:您需要使用主机代码来评估此部分。正在调用XSD验证的主程序如C#,CPP,JAVA等......能够验证这些条件。

答案 1 :(得分:0)

最简单的方法是消除模式中隐含的域分析中的不一致性:一方面,您希望对类型RecentMarket和类型ReducedValue进行风险评级,以便在验证时进行不同的处理。另一方面,你给他们相同的元素类型,隐含地说,为了目的验证,他们应该被视为相同。相同?还是不同的?选择。

给定元素类型RecentMarketRating,ReducedValueRating和OtherRiskRating,解决您的问题是微不足道的。给定一个XML编码来调用它们,你的主要选项是非XSD代码进行验证,XSD 1.1和条件类型赋值或断言的使用,或者除了XSD 1.0之外的Schematron。