对XSD的验证会忽略XML文件中的重复键

时间:2017-01-30 13:21:59

标签: xml xsd key xsd-validation

我正在尝试针对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>

更新以显示它似乎是验证问题。

1 个答案:

答案 0 :(得分:0)

我的理解与你描述的不同。

简而言之,selector选择哪些元素必须是唯一的,field选择使其成为唯一

在这种情况下,选择器会选择TaxTableEntry s的整个列表,对于每个列表,该字段会选择其TaxType。具体来说,这意味着在此列表中(即不在列表的每个项目内,而是在整个列表中),TaxType必须全部不同。

使用keyRef s,可以将这些值作为外键引用,以明确标识TaxTableEntry内的MasterFile(或放置key定义的任何位置)。

如果您身边的验证行为与此不同,请随意共享一个行为与您的预期不同的XML实例,我们可以进一步提供帮助。