String数据类型元素的非空验证取决于其他元素值 - XSD

时间:2017-03-30 14:44:11

标签: xml xpath xsd assertions

我想对String数据类型元素应用非空验证,这取决于其他元素值。我知道这可以通过断言完成,但我不知道如何编写 Xpath 表达式。

这是Optional/mandatory element based on non-sibling element value using xsd:assert?问题的扩展。

我要验证如果'Msgtyp'值为'103',那么'LclTpInf'应为非空或null对于其他'Msgtype',它可以为空或为空。

更新

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>

   

1 个答案:

答案 0 :(得分:0)

谷歌搜索后,我能够解决这个问题。以下是相同的解决方案,希望它对某人有用:

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