使用xsd:assert基于非兄弟元素值的可选/强制元素?

时间:2017-03-23 13:51:53

标签: java xml xpath xsd xsd-validation

我正在尝试对XML的一个元素应用强制和可选的验证,这取决于其他元素的值。

以下是XSD:

<?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>

下面是XML:

LclInstrm

MsgTyp的值为103时,我想强制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. 元素。

当我尝试使用Java中的XSD验证上述XML时,我收到以下错误:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main ()
{
  pid_t pid;

  switch((pid = fork()))
  {
    case -1:
      printf("I'm sorry, fork failed\n");
      break;
    case 0:
      execl("Project1A.c", "./prog", NULL);
      printf("EXECL Unsucessfull");
      break;
    default:
      printf("This is some parent code\n");
      break;
  }
  printf("End of Program\n");

  return 0;
}

有人可以帮我一下吗?

如果您需要更多详细信息,请与我们联系。

1 个答案:

答案 0 :(得分:1)

断言中的XPath是关闭的,因为它假设LclInstrmMsgTyp是兄弟姐妹而不是。

你的断言必须继续使用共同的祖先(P1Message)并引用每个元素的正确相对路径。

所以,你在P1Message上的断言将是:

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

如何使用断言有条件地要求基于另一个元素的值的元素的另一个工作示例可以在这里找到:Require XML element in XSD when another element has certain value?