问题描述
我是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>
解决方法
您遇到几个名称空间问题:
- 您的XML不在XSD的目标名称空间中。
- 您的断言测试在目标空间中引用
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>