xsd:assert不起作用:声明评估未成功

问题描述

我是XSD 1.1 xs:assert的新手,尝试使用XSD验证XML时遇到错误

对模式类型Msgid eq 'ABC'上的元素GrpHdr的评估评估(GroupHeader32)不成功。

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的完整且有效的示例,该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>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...