2012-05-09 3 views
1

내가 (표준 예를 들어 죄송합니다)이 같은 총 합계 확인하기 위해 XML-문서의 유효성을 검사하고 있습니다 :XSLT 유효성 검사 오류가

<book> 
    <name>Book 1</name> 
    <price>25.30</price> 
</book> 
<book> 
    <name>Book 2</name> 
    <price>20.77</price> 
</book> 
<sum>46.07</sum> 

내가 XML 및 검증 스키마를로드, 그리고는 XML을 생성 출력으로. I 소수점 값을 가질 때 내 유효성 검사가 항상 실패

var xml = new XmlDocument(); 
xml.Load(@"c:\test.xml") 

var myXslTrans = new XslCompiledTransform(); 
myXslTrans.Load(@"c:\ValidationSchema.xml";); 
var xmlDocOut = new XmlDocument(); 

    using (XmlWriter xmlWriter = xmlDocOut.CreateNavigator().AppendChild()) 
    { 
     myXslTrans.Transform(xml, null, xmlWriter); 
    } 

어떤 이유 :이 출력은 오류가 발생하는에 대한 정보가 포함되어 있습니다.

나는이 문화를 실행할 수있는 전체 스레드를 변경 한

CultureInfo.InvariantCulture 

으로 두 문서를로드 노력했다. 이것은 인코딩과 관련이있을 수 있습니까?


편집 :

은 더욱이 문제를 명확히하기 위해 :

일찍 코드에서 실행하지만, 일부 대형 서버 작업을 마친 후에는 일부 전역 설정을 보이는 경우 검증이 성공

어떤 종류는 어떤 문화, 인코딩 또는 뭔가를 변경하지만 문제가 발생하는 곳이나 이유를 알 수 없습니다. 나는이 스키마 대한 전자 송장 확인하고

:

<?xml version="1.0" encoding="utf-8"?> 
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" xmlns:ccts="urn:un:unece:uncefact:documentation:2" xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2" xmlns:qdt="urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2" xmlns:udt="urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2 UBL-Invoice-2.0.xsd"> 
    <cbc:UBLVersionID>2.0</cbc:UBLVersionID> 
    <cbc:CustomizationID>urn:www.cenbii.eu:transaction:biicoretrdm010:ver1.0</cbc:CustomizationID> 
    <cbc:ProfileID>urn:www.cenbii.eu:profile:bii05:ver1.0</cbc:ProfileID> 
    <cbc:ID>30300109</cbc:ID> 
    <cbc:IssueDate>2012-05-09</cbc:IssueDate> 
    <cbc:InvoiceTypeCode listID="UN/ECE 1001 Subset" listAgencyID="6">380</cbc:InvoiceTypeCode> 
    <cbc:Note languageID="no">Invoice</cbc:Note> 
    <cbc:DocumentCurrencyCode listID="ISO 4217" listAgencyID="5">NOK</cbc:DocumentCurrencyCode> 
    <cbc:AccountingCost> 
    </cbc:AccountingCost> 
    <cac:OrderReference> 
    <cbc:ID>1234</cbc:ID> 
    </cac:OrderReference> 
    <cac:ContractDocumentReference> 
    <cbc:ID> 
    </cbc:ID> 
    </cac:ContractDocumentReference> 
    <cac:AdditionalDocumentReference> 
    <cbc:ID>1 - 30300109 Faktura</cbc:ID> 
    <cbc:DocumentType>Commercial invoice</cbc:DocumentType> 
    <cac:Attachment> 
     <cbc:EmbeddedDocumentBinaryObject mimeCode="application/pdf">123123123123</cbc:EmbeddedDocumentBinaryObject> 
    </cac:Attachment> 
    </cac:AdditionalDocumentReference> 
    <cac:AccountingSupplierParty> 
    <cac:Party> 
     <cac:PartyName> 
     <cbc:Name>Demo</cbc:Name> 
     </cac:PartyName> 
     <cac:PostalAddress> 
     <cbc:StreetName>Postbox 3</cbc:StreetName> 
     <cbc:CityName>OSLO</cbc:CityName> 
     <cbc:PostalZone>0631</cbc:PostalZone> 
     <cac:Country> 
      <cbc:IdentificationCode listID="ISO 3166" listAgencyID="5">NO</cbc:IdentificationCode> 
     </cac:Country> 
     </cac:PostalAddress> 
     <cac:PartyTaxScheme> 
     <cbc:CompanyID>NO910667831MVA</cbc:CompanyID> 
     <cac:TaxScheme> 
      <cbc:ID>VAT</cbc:ID> 
     </cac:TaxScheme> 
     </cac:PartyTaxScheme> 
     <cac:PartyLegalEntity> 
     <cbc:CompanyID schemeID="CVR" schemeAgencyID="ZZZ">910667831</cbc:CompanyID> 
     </cac:PartyLegalEntity> 
     <cac:Contact> 
     <cbc:ID>Per</cbc:ID> 
     </cac:Contact> 
    </cac:Party> 
    </cac:AccountingSupplierParty> 
    <cac:AccountingCustomerParty> 
    <cac:Party> 
     <cac:PartyIdentification> 
     <cbc:ID>2072</cbc:ID> 
     </cac:PartyIdentification> 
     <cac:PartyName> 
     <cbc:Name>Wenzel</cbc:Name> 
     </cac:PartyName> 
     <cac:PostalAddress> 
     <cbc:StreetName>Road 4</cbc:StreetName> 
     <cbc:CityName>OSLO</cbc:CityName> 
     <cbc:PostalZone>0404</cbc:PostalZone> 
     <cac:Country> 
      <cbc:IdentificationCode listID="ISO 3166" listAgencyID="5">NO</cbc:IdentificationCode> 
     </cac:Country> 
     </cac:PostalAddress> 
     <cac:PartyLegalEntity> 
     <cbc:CompanyID schemeAgencyID="ZZZ" schemeID="ZZZ">986532951</cbc:CompanyID> 
     </cac:PartyLegalEntity> 
     <cac:Contact> 
     <cbc:ID>ww</cbc:ID> 
     </cac:Contact> 
    </cac:Party> 
    </cac:AccountingCustomerParty> 
    <cac:Delivery> 
    <cbc:ActualDeliveryDate>2012-05-09</cbc:ActualDeliveryDate> 
    <cac:DeliveryLocation> 
     <cac:Address> 
     <cbc:StreetName>Road 123</cbc:StreetName> 
     <cbc:CityName>OSLO</cbc:CityName> 
     <cbc:PostalZone>0404</cbc:PostalZone> 
     <cac:Country> 
      <cbc:IdentificationCode>NO</cbc:IdentificationCode> 
     </cac:Country> 
     </cac:Address> 
    </cac:DeliveryLocation> 
    </cac:Delivery> 
    <cac:PaymentMeans> 
    <cbc:PaymentMeansCode listID="UN/ECE 4461">31</cbc:PaymentMeansCode> 
    <cbc:PaymentDueDate>2012-06-08</cbc:PaymentDueDate> 
    <cbc:PaymentID>1020720303001099</cbc:PaymentID> 
    <cac:PayeeFinancialAccount> 
     <cbc:ID schemeID="BBAN">50841051308</cbc:ID> 
    </cac:PayeeFinancialAccount> 
    </cac:PaymentMeans> 
    <cac:AllowanceCharge> 
    <cbc:ChargeIndicator>false</cbc:ChargeIndicator> 
    <cbc:AllowanceChargeReason>rebate</cbc:AllowanceChargeReason> 
    <cbc:Amount currencyID="NOK">4664.21</cbc:Amount> 
    <cac:TaxCategory> 
     <cbc:ID schemeID="UN/ECE 5305" schemeAgencyID="6">S</cbc:ID> 
     <cbc:Percent>25</cbc:Percent> 
     <cac:TaxScheme> 
     <cbc:ID schemeID="UN/ECE 5153" schemeAgencyID="6">VAT</cbc:ID> 
     </cac:TaxScheme> 
    </cac:TaxCategory> 
    </cac:AllowanceCharge> 
    <cac:AllowanceCharge> 
    <cbc:ChargeIndicator>true</cbc:ChargeIndicator> 
    <cbc:AllowanceChargeReason>delivery</cbc:AllowanceChargeReason> 
    <cbc:Amount currencyID="NOK">2938.45</cbc:Amount> 
    <cac:TaxCategory> 
     <cbc:ID schemeID="UN/ECE 5305" schemeAgencyID="6">S</cbc:ID> 
     <cbc:Percent>24.000</cbc:Percent> 
     <cac:TaxScheme> 
     <cbc:ID schemeID="UN/ECE 5153" schemeAgencyID="6">VAT</cbc:ID> 
     </cac:TaxScheme> 
    </cac:TaxCategory> 
    </cac:AllowanceCharge> 
    <cac:TaxTotal> 
    <cbc:TaxAmount currencyID="NOK">11229.08</cbc:TaxAmount> 
    <cac:TaxSubtotal> 
     <cbc:TaxableAmount currencyID="NOK">44916.30</cbc:TaxableAmount> 
     <cbc:TaxAmount currencyID="NOK">11229.08</cbc:TaxAmount> 
     <cac:TaxCategory> 
     <cbc:ID schemeID="UN/ECE 5305" schemeAgencyID="6">S</cbc:ID> 
     <cbc:Percent>25</cbc:Percent> 
     <cac:TaxScheme> 
      <cbc:ID schemeID="UN/ECE 5153" schemeAgencyID="6">VAT</cbc:ID> 
     </cac:TaxScheme> 
     </cac:TaxCategory> 
    </cac:TaxSubtotal> 
    </cac:TaxTotal> 
    <cac:LegalMonetaryTotal> 
    <cbc:LineExtensionAmount currencyID="NOK">46642.06</cbc:LineExtensionAmount> 
    <cbc:TaxExclusiveAmount currencyID="NOK">44916.30</cbc:TaxExclusiveAmount> 
    <cbc:TaxInclusiveAmount currencyID="NOK">56145.38</cbc:TaxInclusiveAmount> 
    <cbc:AllowanceTotalAmount currencyID="NOK">4664.21</cbc:AllowanceTotalAmount> 
    <cbc:ChargeTotalAmount currencyID="NOK">2938.45</cbc:ChargeTotalAmount> 
    <!--<cbc:PrepaidAmount currencyID=""></cbc:PrepaidAmount> 
    <cbc:PayableRoundingAmount currencyID=""></cbc:PayableRoundingAmount>--> 
    <cbc:PayableAmount currencyID="NOK">56145.38</cbc:PayableAmount> 
    </cac:LegalMonetaryTotal> 
    <cac:InvoiceLine> 
    <cbc:ID>1</cbc:ID> 
    <cbc:InvoicedQuantity unitCode="EA">1.00</cbc:InvoicedQuantity> 
    <cbc:LineExtensionAmount currencyID="NOK">12000.00</cbc:LineExtensionAmount> 
    <cac:OrderLineReference> 
     <cbc:LineID>1</cbc:LineID> 
    </cac:OrderLineReference> 
    <cac:TaxTotal> 
     <cbc:TaxAmount currencyID="NOK">2700.00</cbc:TaxAmount> 
    </cac:TaxTotal> 
    <cac:Item> 
     <cbc:Name>Skrivebord</cbc:Name> 
     <cac:SellersItemIdentification> 
     <cbc:ID>13000</cbc:ID> 
     </cac:SellersItemIdentification> 
     <cac:ClassifiedTaxCategory> 
     <cbc:ID schemeID="UN/ECE 5305" schemeAgencyID="6">S</cbc:ID> 
     <cbc:Percent>25.00</cbc:Percent> 
     <cac:TaxScheme> 
      <cbc:ID schemeID="UN/ECE 5153" schemeAgencyID="6">VAT</cbc:ID> 
     </cac:TaxScheme> 
     </cac:ClassifiedTaxCategory> 
    </cac:Item> 
    <cac:Price> 
     <cbc:PriceAmount currencyID="NOK">12000</cbc:PriceAmount> 
    </cac:Price> 
    </cac:InvoiceLine> 
    <cac:InvoiceLine> 
    <cbc:ID>2</cbc:ID> 
    <cbc:InvoicedQuantity unitCode="EA">2.00</cbc:InvoicedQuantity> 
    <cbc:LineExtensionAmount currencyID="NOK">30000.00</cbc:LineExtensionAmount> 
    <cac:OrderLineReference> 
     <cbc:LineID>2</cbc:LineID> 
    </cac:OrderLineReference> 
    <cac:TaxTotal> 
     <cbc:TaxAmount currencyID="NOK">6750.00</cbc:TaxAmount> 
    </cac:TaxTotal> 
    <cac:Item> 
     <cbc:Name>Kontorstol</cbc:Name> 
     <cac:SellersItemIdentification> 
     <cbc:ID>13002</cbc:ID> 
     </cac:SellersItemIdentification> 
     <cac:ClassifiedTaxCategory> 
     <cbc:ID schemeID="UN/ECE 5305" schemeAgencyID="6">S</cbc:ID> 
     <cbc:Percent>25.00</cbc:Percent> 
     <cac:TaxScheme> 
      <cbc:ID schemeID="UN/ECE 5153" schemeAgencyID="6">VAT</cbc:ID> 
     </cac:TaxScheme> 
     </cac:ClassifiedTaxCategory> 
    </cac:Item> 
    <cac:Price> 
     <cbc:PriceAmount currencyID="NOK">15000</cbc:PriceAmount> 
    </cac:Price> 
    </cac:InvoiceLine> 
    <cac:InvoiceLine> 
    <cbc:ID>3</cbc:ID> 
    <cbc:InvoicedQuantity unitCode="MTR">14.50</cbc:InvoicedQuantity> 
    <cbc:LineExtensionAmount currencyID="NOK">3465.50</cbc:LineExtensionAmount> 
    <cac:OrderLineReference> 
     <cbc:LineID>3</cbc:LineID> 
    </cac:OrderLineReference> 
    <cac:TaxTotal> 
     <cbc:TaxAmount currencyID="NOK">779.74</cbc:TaxAmount> 
    </cac:TaxTotal> 
    <cac:Item> 
     <cbc:Name>Persienne</cbc:Name> 
     <cac:SellersItemIdentification> 
     <cbc:ID>13006</cbc:ID> 
     </cac:SellersItemIdentification> 
     <cac:ClassifiedTaxCategory> 
     <cbc:ID schemeID="UN/ECE 5305" schemeAgencyID="6">S</cbc:ID> 
     <cbc:Percent>25.00</cbc:Percent> 
     <cac:TaxScheme> 
      <cbc:ID schemeID="UN/ECE 5153" schemeAgencyID="6">VAT</cbc:ID> 
     </cac:TaxScheme> 
     </cac:ClassifiedTaxCategory> 
    </cac:Item> 
    <cac:Price> 
     <cbc:PriceAmount currencyID="NOK">239</cbc:PriceAmount> 
    </cac:Price> 
    </cac:InvoiceLine> 
    <cac:InvoiceLine> 
    <cbc:ID>4</cbc:ID> 
    <cbc:InvoicedQuantity unitCode="KGM">62.75</cbc:InvoicedQuantity> 
    <cbc:LineExtensionAmount currencyID="NOK">1176.56</cbc:LineExtensionAmount> 
    <cac:OrderLineReference> 
     <cbc:LineID>4</cbc:LineID> 
    </cac:OrderLineReference> 
    <cac:TaxTotal> 
     <cbc:TaxAmount currencyID="NOK">264.73</cbc:TaxAmount> 
    </cac:TaxTotal> 
    <cac:Item> 
     <cbc:Name>Kaffe</cbc:Name> 
     <cac:SellersItemIdentification> 
     <cbc:ID>13005</cbc:ID> 
     </cac:SellersItemIdentification> 
     <cac:ClassifiedTaxCategory> 
     <cbc:ID schemeID="UN/ECE 5305" schemeAgencyID="6">S</cbc:ID> 
     <cbc:Percent>25.00</cbc:Percent> 
     <cac:TaxScheme> 
      <cbc:ID schemeID="UN/ECE 5153" schemeAgencyID="6">VAT</cbc:ID> 
     </cac:TaxScheme> 
     </cac:ClassifiedTaxCategory> 
    </cac:Item> 
    <cac:Price> 
     <cbc:PriceAmount currencyID="NOK">18.750</cbc:PriceAmount> 
    </cac:Price> 
    </cac:InvoiceLine> 
</Invoice> 
+0

당신은 당신의 검증 스키마를 제공 할 수 있습니까? 배경 : 올바른 데이터 유형을 설정 했습니까? –

+1

게시물에 더 많은 정보를 제공했습니다. – soberga

+0

어떻게 cbc : 금액이 정의 되었습니까? –

답변

1

10 진수를 엉망으로 만드는 기본 VB 프로세스가있는 것처럼 보입니다. 나는 하나의 값 (cbc : LineExtensionAmount)과 다른 값 (cac : InvoiceLine/cbc : LineExtensionAmount의 합)을 뺀 새로운 테스트를 추가했다. 그것은 나에게 0.00000000000001의 차이를 줬다. 이 문제에 대한 나의 해결책은 내 문제가 발생한 곳에서 excactly로 지역화 할 수있을 때까지 독립 실행 형 EXE 파일로 XML 유효성 검사를 실행하는 것이 었습니다.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml.Xsl; 
using System.Xml; 

namespace test.Transform 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      // Arguments 
      // Stylesheet 
      // XML-out 
      // outpath-xml-path 

      if (args.Length != 3) 
      { 
       Console.WriteLine("parameters Stylesheet XML-out outpath-xml-path"); 
       return; 
      } 

      XslCompiledTransform xslt = new XslCompiledTransform(); 
      xslt.Load(args[0]); 

      var xml = new XmlDocument(); 
      xml.Load(args[1]); 

      var xmlDocOut = new XmlDocument(); 

      using (XmlWriter xmlWriter = xmlDocOut.CreateNavigator().AppendChild()) 
      { 
       xslt.Transform(xml, null, xmlWriter); 
      } 

      xmlDocOut.Save(args[2]); 
     } 
    } 
} 

첫 번째 인수는 ValidationSchemaPath, 두 번째 XML 경로 및 마지막 출력 경로를 취합니다. 이 같은

전화는 :

public static XmlDocument TestRun2(string xsltPath, string docPath, IReport _report) 
    { 

     var tempFile = Path.Combine(Path.GetTempPath(), Path.GetTempFileName()); 
     var x = Process.GetCurrentProcess().MainModule; 

     Process p = new Process(); 
     p.StartInfo.FileName = Path.Combine(Path.GetDirectoryName(x.FileName), "Transform.exe"); 
     _report.API.WriteLog(p.StartInfo.FileName); 
     p.StartInfo.Arguments = string.Format("\"{0}\" \"{1}\" \"{2}\"", xsltPath, docPath, tempFile); 
     p.StartInfo.UseShellExecute = false; 
     p.StartInfo.RedirectStandardOutput = true; 
     p.Start(); 

     string output = p.StandardOutput.ReadToEnd(); 
     p.WaitForExit(); 

     _report.API.WriteLog("Output from calling Transform.exe"); 
     _report.API.WriteLog(output); 

     if (!File.Exists(tempFile)) 
     { 
      return null; 
     } 

     var xd = new XmlDocument(); 
     xd.Load(tempFile); 

     return xd; 

    } 

} 
0

확인이 매우 귀하의 질문에 대답 하지 않습니다하지만 해결할 수 있습니다 여기에 http://vefa.difi.no/formatvalidering/resources/validation-xslt/NORWAY-UBL-T10.xsl

내 테스트 송장입니다 너의 문제.

var xml = 
    @"<root> 
    <book> 
     <name>Book 1</name> 
     <price>25.30</price> 
    </book> 
    <book> 
     <name>Book 2</name> 
     <price>20.77</price> 
    </book> 
    <sum>46.07</sum> 
    </root>"; 

그런 다음 당신은 당신이 단순히 필요한 모든 것을 할 XML에 LINQ를 사용할 수 있습니다 : XML을 가정

실제로 루트 요소를 포함

var doc = XDocument.Parse(xml); 

var sum = doc.Descendants("book").Sum(e => Convert.ToDecimal(e.Element("price").Value)); 
var total = Convert.ToDecimal(doc.Root.Element("sum").Value); 

Console.WriteLine("sum: [{0}] total: [{1}] matched: [{2}]", sum, total, sum == total); 
+1

그러나 이것은 XML의 유효성을 검사하지 않으며 ** 그가하려고했던 것입니다! :) –

+0

물론 나는 그것을 이해합니다. 그러나 한 사람은 전체를 피할 수 있습니다. 질문에 대한 귀하의 의견에 동의 : 유효성 검사 스키마. – yamen

+1

고마워,하지만 이걸 해결할 수는 없어.) – soberga

0

당신이 링크하신 XSLT 코드 는 Schematron을 사용하여 생성됩니다. (a) 오류가 무엇인지, 그리고 (b) 생성 한 XSLT 코드가 아니라 Schematron 스키마를 보여 주면 오류가 발생하는 이유를 쉽게 알 수 있습니다. 코드에 "Price"가 90 번 이상 있습니다 ...

또한, (a) 귀하의 질문에 책 XML과 인보이스 XML이 서로 어떻게 관련되어 있는지, (b) 당신이 가지고있는 단서는 이것이 문화 나 부호화와 관련이 있다고 생각하게합니다. 그것은 그것의 얼굴에 오히려 불가능한 이론으로 보입니다.

+1

NORWAY-UBL-T10에는 [BIIRULE-T10-R011]이라는 규칙이 있습니다. 이것은 실패한 테스트 중 하나입니다. 총 LineExtensionAmount를 모든 InvoiceLine/LineExtensionAmount의 합계로 테스트합니다. – soberga

관련 문제