xsd:assert 不工作:断言评估没有成功

xsd:assert not working : Assertion evaluation did not succeed

我是 XSD 1.1 xs:assert 的新手,当我尝试使用 XSD:

验证 XML 时出现错误

Assertion evaluation (MsgId eq 'ABC') for element GrpHdr on schema type GroupHeader32 did not succeed.

XSD

抱歉没有放完整的XSD,只放了一部分:

<xs:schema attributeFormDefault="unqualified" xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
    targetNamespace="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03"
    xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1"
    xmlns:xerces="http://xerces.apache.org">    <xs:element name="Document" type="Document"/>

    <xs:complexType name="Document">
        <xs:sequence>
            <xs:element name="CstmrCdtTrfInitn" type="CustomerCreditTransferInitiationV03"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="CustomerCreditTransferInitiationV03">
        <xs:sequence>
            <xs:element name="GrpHdr" type="GroupHeader32"/>
            <xs:element maxOccurs="unbounded" minOccurs="1" name="PmtInf" type="PaymentInstructionInformation3"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="GroupHeader32">       
        <xs:sequence>
            <xs:element name="MsgId" type="Max35Text"/>
            <xs:element name="CreDtTm" type="ISODateTime"/>
            <xs:element maxOccurs="2" minOccurs="0" name="Authstn" type="Authorisation1Choice"/>
            <xs:element name="NbOfTxs" type="Max15NumericText"/>
            <xs:element maxOccurs="1" minOccurs="0" name="CtrlSum" type="DecimalNumber"/>
            <xs:element name="InitgPty" type="PartyIdentification32"/>
            <xs:element maxOccurs="1" minOccurs="0" name="FwdgAgt" type="BranchAndFinancialInstitutionIdentification4"/>
        </xs:sequence>
        <xs:assert test="MsgId eq 'ABC'"/> 
    </xs:complexType>
</xs:schema>

这是放置 xs:assert 条件以检查元素 MsgID 的值等于 ABC 的正确位置吗?

我正在使用 oXygen XML 软件进行验证。

样本XML

 <CstmrCdtTrfInitn>
     <GrpHdr>
         <MsgId>ABC</MsgId>
         <CreDtTm>2009-02-17T12:49:35</CreDtTm>
         <NbOfTxs>1</NbOfTxs>
     </GrpHdr>
 </CstmrCdtTrfInitn>

您有几个命名空间问题:

  1. 您的 XML 不在您的 XSD 的目标命名空间中。
  2. 你的断言测试在没有命名空间中引用 MsgId,尽管它在目标命名空间中。

这是一个完整的工作示例 XML 和一个 XSD 使用(已修复的)示例断言成功验证它的示例:

XML

<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03">
  <CstmrCdtTrfInitn>
    <GrpHdr>
      <MsgId>ABC</MsgId>
      <CreDtTm>2009-02-17T12:49:35</CreDtTm>
      <NbOfTxs>1</NbOfTxs>
    </GrpHdr>
  </CstmrCdtTrfInitn>
</Document>

XSD

<xs:schema  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  targetNamespace="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03"
  xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03"
  xmlns:pa="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03"
  attributeFormDefault="unqualified"
  elementFormDefault="qualified"
  xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" 
  vc:minVersion="1.1">
  
  <xs:element name="Document" type="Document"/>
 
  <xs:complexType name="Document">
    <xs:sequence>
      <xs:element name="CstmrCdtTrfInitn" type="CustomerCreditTransferInitiationV03"/>
    </xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="CustomerCreditTransferInitiationV03">
    <xs:sequence>
      <xs:element name="GrpHdr" type="GroupHeader32"/>
    </xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="GroupHeader32">       
    <xs:sequence>
      <xs:element name="MsgId" type="xs:string"/>
      <xs:element name="CreDtTm" type="xs:string"/>
      <xs:element maxOccurs="2" minOccurs="0" name="Authstn" type="xs:string"/>
      <xs:element name="NbOfTxs" type="xs:string"/>
    </xs:sequence>
    <xs:assert test="pa:MsgId eq 'ABC'"/> 
  </xs:complexType>
</xs:schema>