XML ve XSLT Parse Problemi

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
malitutuncu
Üye
Mesajlar: 18
Kayıt: 21 Şub 2017 03:27

XML ve XSLT Parse Problemi

Mesaj gönderen malitutuncu » 04 Oca 2018 04:38

Merhaba arkadaşlar

Yazmış olduğum Efatura - Earşiv uygulamasında gelen faturaların UBL lerini (xml) indiriyorum.
İçerisinde XSLT dosyasının base64 e göre encode edildiği yeri alıyorum. ve base64e göre decode ediyorum.
bunu IXMLDOMDocument ekliyorum.
xml leride başka IXMLDOMDocument e ekliyorum.
Daha sonra XSLT ve XML parse ederek html koduna dönüştürüyorum.
Daha sonra webBrowser de faturayı görüntülüyorum.
Ancak bir fatura da sorun yaşıyorum.

Buradaki sorunum gelen bir fatura xml inde
html deki ENTITY ler ile ÖR: nbsp(boşluk tuşu) yerine   karakterini kullanması.

Aldığım Hata : 'Xsl:stylesheet' öğesi kullanıldı ancak DTD/Schema'sında bildirilmedi.

ilgili bölümlerin kodlarını paylaşıyım

Kod: Tümünü seç

var
  XMLDoc,
  XMLXslt : IXMLDOMDocument;
  xsltStr : AnsiString;
  XMLHtml : AnsiString;

Kod: Tümünü seç

	
    Tag3 := '';
    Tag2 := 'cac:';
    Tag1 := 'cbc:';
	
    //GELEN FATURA XMLİ
    XMLDoc       := CoDomDocument.Create();
    XMLDoc.async := False;
    XMLDoc.loadXML(aXMLString);
    if XMLDoc.parseError.errorCode <> 0 then
    raise Exception.Create('XML yükleme hatası: '+ XMLDoc.parseError.reason);	
 
    vNodes := XMLDoc.selectNodes(Trim(tag3+'Invoice/'+tag2+'AdditionalDocumentReference/'+tag2+'Attachment/'+tag1+'EmbeddedDocumentBinaryObject'));

    for i := 0 to vNodes.length -1 do
    begin
      vNode := vNodes.item[i];
      for j := 0 to vNode.attributes.length - 1 do
      begin
        vAttr := vNode.attributes.item[j];
        if vAttr.nodeName = 'filename' then
        if Pos('xslt',VarToStr(vAttr.nodeValue)) > 0 then
          begin
              xsltStr := AnsiString(TEncoding.UTF8.GetString(DecodeBase64(vNode.text)));
            Break;
          end;
      end;
    end;
	
    //XSLT 
    XMLXslt       := CoDomDocument.Create();
    XMLXslt.async := False;
    XMLXslt.loadXML(xsltStr);
    if XMLXslt.parseError.errorCode <> 0 then
    raise Exception.Create('XML yükleme hatası:' + XMLXslt.parseError.reason);	
	
    XMLHtml       :=  XMLDoc.transformNode(XMLXslt);
    LoadHtmlBrowser(wbBrowser, XMLHtml);	

Faturanın xmlinin sorun yaşadığım kısmı

Kod: Tümünü seç

  <!DOCTYPE xsl:stylesheet  [
  <!ENTITY nbsp   "&#160;">
  <!ENTITY copy   "&#169;">
  <!ENTITY reg    "&#174;">
  <!ENTITY trade  "&#8482;">
  <!ENTITY mdash  "&#8212;">
  <!ENTITY ldquo  "&#8220;">
  <!ENTITY rdquo  "&#8221;">
  <!ENTITY pound  "&#163;">
  <!ENTITY yen    "&#165;">
  <!ENTITY euro   "&#8364;">
]>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	exclude-result-prefixes="cac cbc ccts clm54217 clm5639 clm66411 clmIANAMIMEMediaType fn link n1 qdt udt xbrldi xbrli xdt xlink xs xsd xsi"
	..............
Faturada nbsp kullanılan örnekbir yer

Kod: Tümünü seç

 
  <td style="color: #3c7a94"  id="lineTableTd" bgcolor="#d5d5d5">Çarpan</td>
  <td id="lineTableTd">
	&nbsp;&nbsp;&nbsp;&nbsp;<xsl:for-each select="//n1:Invoice/cbc:Note">
	  <xsl:if test="substring(.,1,13) ='Aktif Carpan:'">
		<xsl:value-of select="substring(.,14,50)"/>
	  </xsl:if>
	</xsl:for-each>
  </td>
Bilen arkadaşlar yardımcı olursa sevinirim.
Teşekkürler.

mkysoft
Kıdemli Üye
Mesajlar: 2833
Kayıt: 25 Ağu 2003 11:35
Konum: İstanbul
İletişim:

Re: XML ve XSLT Parse Problemi

Mesaj gönderen mkysoft » 04 Oca 2018 10:09

Sorun &nbsp; değil. Fatura görseli geçerli bir xml değil, eğer varsa hataları yok saymasını söyleyebilirsiniz belki.

malitutuncu
Üye
Mesajlar: 18
Kayıt: 21 Şub 2017 03:27

Re: XML ve XSLT Parse Problemi

Mesaj gönderen malitutuncu » 05 Oca 2018 08:56

Peki onu nasıl yapacağız hocam.

Hocam birde bu faturanın xslt dosyası yanlışsa gib den , entegratör den nasıl geçiyor. bunu entegratörün portalında görüntüleyebiliyorum

mkysoft
Kıdemli Üye
Mesajlar: 2833
Kayıt: 25 Ağu 2003 11:35
Konum: İstanbul
İletişim:

Re: XML ve XSLT Parse Problemi

Mesaj gönderen mkysoft » 12 Oca 2018 08:32

GİB portal saxon kütüphanesini kullanıyor, hataları yoksayma özelliği var. Yine microsoft kütüphanesinin de var. Muhtemelen delphidede vardır, nasıl yapılacağını bilmiyorum malasef.
Fatura görseli zorunlu değildir.
GİB yada herhangi bir entegratörün görselin doğruluğunu denetleme yetkisi yok, özelliği de yok.
Uygulamanızda standart bir görsel bulundurarak, kullanıcıyı uyararak bu görsel ile açabilirsiniz faturayı.

malitutuncu
Üye
Mesajlar: 18
Kayıt: 21 Şub 2017 03:27

Re: XML ve XSLT Parse Problemi

Mesaj gönderen malitutuncu » 18 Oca 2018 08:46

Hocam problemi şöyle hallettim.
Normalinde UBL leri bilgisayarda depolayıp bakıp varsa direk oradan parse ediyorum .
Eger parse işlemini yapamıyorsam,
Entegratörden faturanın html'ini indiriyorum. Kullanıcıya direk bunu gösteriyorum.
Böylece farklı farklı tasarımlarda ki faturaları görüntüleyebiliyorum.

Cevapla