我正在尝试编写XPath验证表达式来检查下面显示的XML表单的正确性。我想验证一下:
OperationType = 1
单个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>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>
答案 0 :(得分:1)
您可以使用:
/wnio:Document/wnio:Content/wnio:SubmittedUsers/wnio:User
[(wnio: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
节点