2017-03-23 2 views
1

私は、他の要素の値に依存するXMLの1つの要素に対して、必須のオプションとオプションのバリデーションを適用しようとしています。xsd:assertを使用した非兄弟要素値に基づくオプション/必須要素。

以下

XSDです:

以下
<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" 
     vc:minVersion="1.1"> 

<xs:element name="root" type="root"></xs:element> 

<xs:complexType name="root"> 
    <xs:sequence> 
     <xs:element name="P1Message" 
      type="p1Message"> 
     </xs:element> 
    </xs:sequence> 
</xs:complexType> 

<xs:complexType name="p1Message"> 
    <xs:sequence> 
     <xs:element name="Hdr" type="hdr"></xs:element> 
     <xs:element name="Inf" type="inf"></xs:element>   
    </xs:sequence> 
</xs:complexType> 

<xs:complexType name="hdr"> 
    <xs:sequence> 
     <xs:element name="I1Agt" type="i1Agt"></xs:element> 
     <xs:element name="SequenceNum" type="xs:string"></xs:element> 
     <xs:element name="SessionNum" type="xs:string"></xs:element>   
     <xs:element name="MsgTyp" type="xs:string"></xs:element>     
     <xs:element name="IntComment" type="xs:string"></xs:element> 
    </xs:sequence> 
<xs:assert test="LclInstrm or not(MsgTyp = '103')"/>  
</xs:complexType> 

<xs:complexType name="i1Agt"> 
    <xs:sequence> 
     <xs:element name="FinInstnId" type="finInstnId"></xs:element> 
    </xs:sequence> 
</xs:complexType> 

<xs:complexType name="finInstnId"> 
    <xs:sequence> 
     <xs:element name="B1" type="xs:string"></xs:element> 
    </xs:sequence> 
</xs:complexType> 

<xs:complexType name="inf"> 
    <xs:sequence>   
     <xs:element name="PmtTpInf" type="pmtTpInf"></xs:element>   
    </xs:sequence> 
</xs:complexType> 

<xs:complexType name="pmtTpInf"> 
    <xs:sequence> 
     <xs:element name="LclInstrm" type="xs:string" minOccurs="0" maxOccurs="1"></xs:element> 
     <xs:element name="Svc" type="svc"></xs:element> 
    </xs:sequence>  
</xs:complexType> 

<xs:complexType name="svc"> 
    <xs:sequence> 
     <xs:element name="Cd" type="xs:string"></xs:element> 
    </xs:sequence> 
</xs:complexType> 
</xs:schema> 

はXMLです:

<?xml version="1.0" encoding="utf-8"?> 
<root> 
<P1Message> 
<Hdr> 
    <I1Agt> 
    <FinInstnId> 
     <B1>str1234</B1> 
    </FinInstnId> 
    </I1Agt> 
    <SequenceNum>str1234</SequenceNum> 
    <SessionNum>str1234</SessionNum> 
    <MsgTyp>123</MsgTyp> 
    <IntComment>str1234</IntComment> 
</Hdr> 
<Inf> 
    <PmtTpInf> 
    <LclInstrm>str1234</LclInstrm> 
    <Svc> 
     <Cd>str1234</Cd> 
    </Svc> 
    </PmtTpInf> 
</Inf> 
</P1Message> 
</root> 

私が検証しようとしていたとき、私はMsgTypの値が103

ときLclInstrm要素は必須にしたいですJavaでXSDを使用したXMLの上私は以下のエラーを受け取りました:

message.xml is not valid because cvc-assertion.3.13.4.1: Assertion evaluation ('LclInstrm or not(MsgTyp = '103')') for element `Hdr` with type `hdr` did not succeed. 

誰でも私と同じようにお手伝いできますか?

詳細が必要な場合はお知らせください。

+0

あなたの素早い返信のためにkjhughesに感謝します。私のアサーション条件を動作させるには、 "

+0

これは以下の条件で動作します: "MsgTyp"の値が** '103' **および** 'LclInstrm' **以外の場合。しかし、** "MsgTyp" **が** '103' ** ** 'LclInstrm' **が存在する場合、XMLの検証中に上記のエラーが発生します。 –

+0

私はここでのコメント(そしてこのコメントは短い間に)で廃止された議論を削除します。コメントを削除することもできます。 – kjhughes

答えて

1

アサーションのXPathがオフである場合は、LclInstrmMsgTypが兄弟であると仮定しているため、アサーションのXPathがオフになっています。

アサーションは共通の祖先(P1Message)に移動し、各要素への正しい相対パスを参照する必要があります。

だから、P1Message上のあなたの主張は次のようになります。

<xs:assert test="Inf/PmtTpInf/LclInstrm or not(Hdr/MsgTyp = '103')"/> 

条件付きで別の要素の値に基づいて要素を必要とするアサーションを使用する方法の別の実施例は、ここで見つけることができます:Require XML element in XSD when another element has certain value?

関連する問題