0

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>

私が抱えている問題は、 isとの間の要素xsdに対して XOR を作成するように制限する必要があることですが、これを行う方法が思いつきません。RiskRatingsRatingTypeReducedValueRecentMarketValue

例で説明するのが最も適切です。したがって、ここにいくつかのサンプル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>

受け入れられず、スキーマ検証エラーをスローする必要があります (つまり RecentMarketReducedValue渡された両方):

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

誰も私がこれを行う方法を知っていましたか?

4

2 に答える 2

1

XSD(単独)では不可能です!!

回避策: 多くの場合、HOST CODE を使用してこの部分のみを評価する必要があります。C#、CPP、JAVA などの XSD 検証を呼び出すホスト プログラムは、これらの種類の条件を検証できます。

于 2012-06-12T12:43:58.223 に答える
0

最も簡単な方法は、スキーマに暗黙的に含まれるドメインの分析における矛盾を解消することです。一方では、RecentMarket 型と ReducedValue 型のリスク評価を、検証のために異なる方法で処理する必要があります。それらに同じ要素タイプを与えています。これは、検証目的のためにそれらを同じように扱う必要があることを暗黙的に示しています。同じ?または異なる?選ぶ。

要素の型が RecentMarketRating、ReducedValueRating、および OtherRiskRating の場合、問題を解決するのは簡単です。それらをすべて同じように呼び出す XML エンコーディングを考えると、主なオプションは、検証を行う非 XSD コード、XSD 1.1 および条件付き型割り当てまたはアサーションの使用、または XSD 1.0 に加えて Schematron です。

于 2012-09-09T17:48:59.163 に答える