2017-10-30 9 views
0

以下に示すXML形式の正当性をチェックするためのXPath検証式を作成しようとしています。私はそれを検証したいと思います:OperationType = 1の場合複数のXMLタグを使用したXPathの複数の検証条件

  • 単一Userノード内のすべてのフィールドがOperationType = 2の場合に
  • を満たされている、少なくともLoginフィールドを

それぞれUserノードが満たされる範囲内私は次の式を考え出しましたが、単一のUserノードが存在する場合にのみ動作します。

//wnio:Login!='' 
and (//wnio:FirstName!='' or //wnio:OperationType!='1') 
and (//wnio:LastName!='' or //wnio:OperationType!='1') 
and (//wnio:Email!='' or //wnio:OperationType!='1') 

ただし、別のUserタグでこれらのフィールドが空でない場合は、文書の正当性が検証されます。

これらの条件を次のような構造で検証することが可能かどうかを知りたいと思います。私はこの問題をどのように処理するかについての提案に感謝します。

あなたが使用することができ
<wnio:Document> 
    <wnio:Content> 
     <wnio:SubmittedUsers> 
      <wnio:User> 
       <wnio:OperationType>1</wnio:OperationType> 
       <wnio:FirstName>Adam</wnio:FirstName> 
       <wnio:Login>adamnowak</wnio:Login> 
       <wnio:Email>[email protected]</wnio:Email> 
       <wnio:LastName>Nowak</wnio:LastName> 
      </wnio:User> 
      <wnio:User> 
       <wnio:OperationType>2</wnio:OperationType> 
       <wnio:FirstName/> 
       <wnio:Login>testlogin</wnio:Login> 
       <wnio:Email/> 
       <wnio:LastName/> 
      </wnio:User> 
      <wnio:User> 
       <wnio:OperationType>1</wnio:OperationType> 
       <wnio:FirstName>John</wnio:FirstName> 
       <wnio:Login>johnsmith</wnio:Login> 
       <wnio:Email>[email protected]</wnio:Email> 
       <wnio:LastName>Smith</wnio:LastName> 
      </wnio:User> 
     </wnio:SubmittedUsers> 
     <wnio:AuthorityType>1</wnio:AuthorityType> 
    </wnio:Content> 
</wnio:Document> 
+1

を埋めなければならないOperationType = 2の場合に

  • を埋めることがあなたのような何かを試してみました: '/ wnio:ドキュメント/ wnioを:コンテンツ/ wnio:SubmittedUsers/wnioを: [wnio:Operation!= ''とwnio:LastName!= '') または(wnio:OperationType = '1'とwnio:FirstName! '2'とwnio:Login!= '')] ' – GGO

  • +0

    @GGO - これは正しく動作します!ご助力ありがとうございます! –

    答えて

    1

    正しい発現した:上記の式は両方の条件の検証エラーを返し

    not(/wnio:Dokument/wnio:TrescDokumentu/wnio:SubmittedUsers/wnio:User[ 
    ((wnio:OperationType='1' 
        and (wnio:Login = '' or wnio:FirstName= '' or wnio:LastName= '' or wnio:Email= '')) 
    or (wnio:OperationType='2' and wnio:Login= '')) 
    ]) 
    

    に簡略化することができる

    not(/wnio:Dokument/wnio:TrescDokumentu/wnio:SubmittedUsers/wnio:User[ 
    (wnio:OperationType='1' and wnio:Login = '') 
    or (wnio:OperationType='1' and wnio:FirstName= '') 
    or (wnio:OperationType='1' and wnio:LastName= '') 
    or (wnio:OperationType='1' and wnio:Email= '') 
    or (wnio:OperationType='2' and wnio:Login= '') 
    ]) 
    

    • OperationType = 1の場合は、すべてのフィールドを1つにまとめますUserノード は それぞれUserノード内の少なくともLoginフィールドが
    +0

    あなたの単純化は私の解決策のように疑わしいようです。 :) – Tomalak

    +0

    @Tomalakあなたは正しいです - あなたの解決策は私を助け、私は本当に感謝します。主な違いは、すべてのXPath式を無効にしなければならないということでした。 –

    1

    /wnio:Document/wnio:Content/wnio:SubmittedUsers/wnio:User 
    [(w‌​nio:OperationType = '1' and wnio:FirstName != '' and wnio:Login != '' and wnio:Email != '' and wnio:LastName != '') 
    or (wnio:OperationType = '2' and wnio:Login != '')] 
    
    1

    はあなたのあなたの条件のいずれかを満たし、そして得られたノードセットが空であるかどうか表示されていないwnio:Userの要素を選択します。

    //wnio:User[not(
        (
        wnio:OperationType = '1' 
        and wnio:Login > '' 
        and wnio:FirstName > '' 
        and wnio:LastName > '' 
    ) 
        or (
        wnio:OperationType = '2' 
        and wnio:Login > '' 
    ) 
    )] 
    

    これが何も選択しない場合、すべてのwnio:User要素があなたのルールを満たしています。あなたは無効な要素を選択する条件を追加することができます。OperationType

    XMLで意味規則を強制するために、XML Schema(またはRelax NG)を参照してください。私は(EPUAP)で動作するシステムにおいて

    +0

    残念ながら、すべての空のフィールドと各列の別々の行に塗りつぶされたフィールドを持つドキュメントを渡すことができました。 –

    +0

    私の答えで2番目の段落を読んだことがありますか? – Tomalak

    +0

    はい、私はそれを数回チェックし、最終的には第1行で 'not 'を削除した後に動作しました。ありがとう! –

    関連する問題