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 " ">
<!ENTITY copy "©">
<!ENTITY reg "®">
<!ENTITY trade "™">
<!ENTITY mdash "—">
<!ENTITY ldquo "“">
<!ENTITY rdquo "”">
<!ENTITY pound "£">
<!ENTITY yen "¥">
<!ENTITY euro "€">
]>
<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"
..............
Kod: Tümünü seç
<td style="color: #3c7a94" id="lineTableTd" bgcolor="#d5d5d5">Çarpan</td>
<td id="lineTableTd">
<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>
Teşekkürler.