2017-01-30 2 views
0

Я пытаюсь проверить XML-файлы на this schema.Проверка на XSD игнорирует дубликаты ключей в XML-файле

Существует раздел главной таблицы, который содержит данные, которые затем ссылаются на другие места в файле. Предполагается, что таблица MasterFile содержит уникальные записи, поэтому на них можно ссылаться из другого места в xml-файле.

Однако я не могу понять, что должно быть недействительными. Я попытался проверить в блокноте XML Notepad ++ с помощью инструментов XML и Eclipse.

Определение 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> 

Ключевого и 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> 

Пример минимального XML-файл, который должен сломать ключ сдержанности TaxType, но которая проверяет в 3 различные инструменты. Валидация работает для всего, кроме ключей, поскольку я получаю ошибки, когда добавляю несуществующий элемент или меняю порядок элементов в сквоенте, поэтому я вижу, что валидация происходит по крайней мере.

<?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

Мое понимание отличается от того, что вы описываете.

Короче говоря, selector выбирает , что элементы должны быть уникальными, и field выбирает то, что делает их уникальными.

В этом случае селектор выбирает весь список TaxTableEntry s, и для каждого из них поле выбирает его TaxType. Конкретно это означает, что в этом списке (то есть не внутри каждого элемента списка, а во всем списке), TaxType s должны быть разными.

С keyRef с, эти значения можно ссылаться как внешние ключи, чтобы однозначно идентифицировать TaxTableEntry в MasterFile (или там, где вы размещаете key определение).

Если поведение валидации на вашей стороне отклоняется от этого, не стесняйтесь делиться экземпляром XML, который ведет себя иначе, чем вы ожидаете, и мы можем помочь дальше.

+0

Я также предполагал, что так оно и было, или, по крайней мере, как создатель схемы хотел, чтобы он работал. Я отредактировал свой пост и добавил пример, который проверяется с помощью дубликатов 'TaxType'. – johankr

+0

Спасибо! Похоже, это связано с привязкой пространства имен. Не могли бы вы вставить привязки пространства имен из файлов схемы? (Все, что похоже на 'xmlns'). Благодаря! –

+0

Некоторые результаты, когда поисковая система подсказывает, что это может быть источником проблемы. Это то, что вы имели в виду? '' – johankr

Смежные вопросы