具有多个XML标记的XPath多个验证条件

时间:2017-10-30 10:17:44

标签: xml validation xpath

我正在尝试编写XPath验证表达式来检查下面显示的XML表单的正确性。我想验证一下:

  • 如果OperationType = 1单个User节点中的所有字段都已填写
  • 如果OperationType = 2Login节点内至少有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>adamnowak@example.com</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>johnsmith@example.com</wnio:Email>
                <wnio:LastName>Smith</wnio:LastName>
            </wnio:User>
        </wnio:SubmittedUsers>
        <wnio:AuthorityType>1</wnio:AuthorityType>
    </wnio:Content>
</wnio:Document>

3 个答案:

答案 0 :(得分: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 :(得分: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 Schema(或Relax NG),因为这些是为了在XML中强制执行语义规则。

答案 2 :(得分:1)

在我使用的系统(ePUAP)中,正确的表达是:

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= '')
])

可以简化为:

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= ''))
])

上述表达式返回两个条件的验证错误:

  • 如果OperationType = 1单个User节点中的所有字段必须为。{li> 填充
  • 如果OperationType = 2内至少有Login字段 必须填写相应的User节点