说明我的问题的最好方法是发布我目前拥有的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
,以便在RiskRatings
为RatingType
和{ReducedValue
的元素之间为RecentMarketValue
创建XOR。 {1}},但我想不出办法做到这一点。
最好通过示例进行描述,因此我可能会收到一些示例RiskAnalysis
元素(在xsd
伪代码中):
可接受(即ReducedValue
或RecentMarket
都没有传入):
<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>
不接受并且应该抛出架构验证错误(即传入RecentMarket
和ReducedValue
):
<RiskAnalysis>
<RiskRating RatingType="Land" />
<RiskRating RatingType="Other" />
<RiskRating RatingType="RecentMarket" />
<RiskRating RatingType="ReducedValue" />
</RiskAnalysis>
有人知道我会怎么做吗?
答案 0 :(得分:1)
XSD(单独)不可能!!
变通方法解决方案:您需要使用主机代码来评估此部分。正在调用XSD验证的主程序如C#,CPP,JAVA等......能够验证这些条件。
答案 1 :(得分:0)
最简单的方法是消除模式中隐含的域分析中的不一致性:一方面,您希望对类型RecentMarket和类型ReducedValue进行风险评级,以便在验证时进行不同的处理。另一方面,你给他们相同的元素类型,隐含地说,为了目的验证,他们应该被视为相同。相同?还是不同的?选择。
给定元素类型RecentMarketRating,ReducedValueRating和OtherRiskRating,解决您的问题是微不足道的。给定一个XML编码来调用它们,你的主要选项是非XSD代码进行验证,XSD 1.1和条件类型赋值或断言的使用,或者除了XSD 1.0之外的Schematron。