我正在尝试针对this schema验证XML文件。
有一个主表部分,用于包含随后从文件中其他位置引用的数据。 MasterFile表应该包含唯一条目,以便可以从xml文件中的其他位置引用它们。
然而,我无法让它识别出应该是无效密钥的内容。我尝试使用XML Tools和Eclipse在XML Notepad,Notepad ++中进行验证。
从上面的方案定义TaxTable:
<xs:element name="TaxTable" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="TaxTableEntry" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="TaxType" type="FAIAcodeType">
</xs:element>
<xs:element name="Description" type="FAIAlongtextType">
</xs:element>
<xs:element name="TaxCodeDetails" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="TaxCode" type="FAIAcodeType">
</xs:element>
<xs:element name="EffectiveDate" type="xs:date" minOccurs="0">
</xs:element>
<xs:element name="ExpirationDate" type="xs:date" minOccurs="0">
</xs:element>
<xs:element name="Description" type="FAIAlongtextType" minOccurs="0">
</xs:element>
<xs:choice minOccurs="0">
<xs:element name="TaxPercentage" type="xs:decimal">
</xs:element>
<xs:element name="FlatTaxRate" type="AmountStructure">
</xs:element>
</xs:choice>
<xs:element name="Country" type="ISOCountryCode">
</xs:element>
<xs:element name="Region" type="FAIAcodeType" minOccurs="0">
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
Key和KeyRef定义:
<xs:key name="KeyTaxType">
<xs:selector xpath="MasterFiles/TaxTable/TaxTableEntry"/>
<xs:field xpath="TaxType"/>
</xs:key>
<xs:keyref name="RefRegistrationTaxType" refer="KeyTaxType">
<xs:selector xpath="Header/Company/TaxRegistration"/>
<xs:field xpath="TaxType"/>
</xs:keyref>
<xs:keyref name="RefCustomerTaxType" refer="KeyTaxType">
<xs:selector xpath="MasterFiles/Customers/Customer/TaxRegistration"/>
<xs:field xpath="TaxType"/>
</xs:keyref>
应该破坏TaxType键约束但在3个不同工具中验证的最小xml文件的示例。验证适用于除键之外的所有内容,因为当我添加不存在的元素或更改序列中元素的顺序时出现错误,因此我可以看到验证至少发生。
<?xml version="1.0" encoding="UTF-8"?>
<xs:AuditFile
xmlns:xs="urn:OECD:StandardAuditFile-Taxation/2.00"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:OECD:StandardAuditFile-Taxation/2.00 ../../main/resources/FAIA_v_2_01_full.xsd ">
<xs:Header>
<xs:AuditFileVersion>2.0.1</xs:AuditFileVersion>
<xs:AuditFileCountry>LU</xs:AuditFileCountry>
<xs:AuditFileDateCreated>2001-01-01</xs:AuditFileDateCreated>
<xs:SoftwareCompanyName>TestCorp</xs:SoftwareCompanyName>
<xs:SoftwareID>Test</xs:SoftwareID>
<xs:SoftwareVersion>Test</xs:SoftwareVersion>
<xs:Company>
<xs:RegistrationNumber>123456</xs:RegistrationNumber>
<xs:Name>Test Corporation</xs:Name>
<xs:Address>
<xs:City>London</xs:City>
<xs:PostalCode>123456</xs:PostalCode>
</xs:Address>
<xs:Contact>
<xs:ContactPerson>
<xs:FirstName>John</xs:FirstName>
<xs:LastName>Doe</xs:LastName>
</xs:ContactPerson>
<xs:Telephone>45646825</xs:Telephone>
</xs:Contact>
<xs:TaxRegistration>
<xs:TaxRegistrationNumber>LU1234566-78</xs:TaxRegistrationNumber>
<xs:TaxType>TVA</xs:TaxType>
<xs:TaxNumber>LU1234566-78</xs:TaxNumber>
</xs:TaxRegistration>
</xs:Company>
<xs:DefaultCurrencyCode>EUR</xs:DefaultCurrencyCode>
<xs:SelectionCriteria>
<xs:TaxReportingJurisdiction>xs:TaxReportingJurisdiction</xs:TaxReportingJurisdiction>
<xs:CompanyEntity>xs:CompanyEntity</xs:CompanyEntity>
<xs:SelectionStartDate>2015-01-01</xs:SelectionStartDate>
<xs:SelectionEndDate>2015-12-31</xs:SelectionEndDate>
<xs:DocumentType>xs:DocumentType</xs:DocumentType>
<xs:OtherCriteria>First Other Criteria</xs:OtherCriteria>
<xs:OtherCriteria>Second Other Criteria</xs:OtherCriteria>
</xs:SelectionCriteria>
<xs:HeaderComment>xs:HeaderComment</xs:HeaderComment>
<xs:TaxAccountingBasis>Invoice Accounting</xs:TaxAccountingBasis>
<xs:TaxEntity>xs:TaxEntity</xs:TaxEntity>
</xs:Header>
<xs:MasterFiles>
<xs:TaxTable>
<xs:TaxTableEntry>
<xs:TaxType>TVA</xs:TaxType>
<xs:Description>Taxe sur la valeur ajoutée</xs:Description>
<xs:TaxCodeDetails>
<xs:TaxCode>1</xs:TaxCode>
<xs:EffectiveDate>2010-01-01</xs:EffectiveDate>
<xs:Description>LU/01/0/0.00 - TVA sur ventes</xs:Description>
<xs:TaxPercentage>0.0</xs:TaxPercentage>
<xs:Country>LU</xs:Country>
</xs:TaxCodeDetails>
</xs:TaxTableEntry>
<xs:TaxTableEntry>
<xs:TaxType>TVA</xs:TaxType>
<xs:Description>Taxe sur la valeur ajoutée</xs:Description>
<xs:TaxCodeDetails>
<xs:TaxCode>1</xs:TaxCode>
<xs:EffectiveDate>2010-01-01</xs:EffectiveDate>
<xs:Description>LU/01/0/0.00 - TVA sur ventes</xs:Description>
<xs:TaxPercentage>0.0</xs:TaxPercentage>
<xs:Country>LU</xs:Country>
</xs:TaxCodeDetails>
</xs:TaxTableEntry>
</xs:TaxTable>
</xs:MasterFiles>
更新以显示它似乎是验证问题。
答案 0 :(得分:0)
我的理解与你描述的不同。
简而言之,selector
选择哪些元素必须是唯一的,field
选择使其成为唯一。
在这种情况下,选择器会选择TaxTableEntry
s的整个列表,对于每个列表,该字段会选择其TaxType
。具体来说,这意味着在此列表中(即不在列表的每个项目内,而是在整个列表中),TaxType
必须全部不同。
使用keyRef
s,可以将这些值作为外键引用,以明确标识TaxTableEntry
内的MasterFile
(或放置key
定义的任何位置)。
如果您身边的验证行为与此不同,请随意共享一个行为与您的预期不同的XML实例,我们可以进一步提供帮助。