Avatar billede mungojerrie Nybegynder
25. maj 2005 - 14:58 Der er 15 kommentarer og
1 løsning

fra xml til ascii med danske bogstaver

Hej
Jeg har en lille udfordring, hvor jeg først skal danne et xml dokument som gør fint. Udfra mit xml dokument skal jeg via XSL(T) danne et tekst dokument som skal være med ASCII encoding og det er her jeg oplever problemet.

Inden jeg danner mit tekst dokument løber jeg først mit xml dokument igennem for at ændre mine danske bogstaver fra UTF-8 til ASCII og her er der givetvis også et problem.

Jeg gør følgende:

//Dan xml fil
XmlDocument doc = new XmlDocument();
doc.Load(filename);
XmlElement root = doc.DocumentElement;
XPathNavigator nav = root.CreateNavigator();
XslTransform xslt = new XslTransform();

//Transformer xml fil via XSL
xslt.Load(TransformerFileName);
FileStream fileStream = new FileStream(resultfile, FileMode.Append);
XmlTextWriter writer = new XmlTextWriter(fileStream, System.Text.Encoding.UTF8);
xslt.Transform(nav, null, writer, null);
writer.Close();
fileStream.Close();

//åbn nylavet xml fil og konverter de danske bogstaver...
//open the newly created file and read content
FileStream fs = new FileStream(resultfile, FileMode.Open);
StreamReader sr = new StreamReader(fs, System.Text.Encoding.UTF8);

//Convert danish characters to DOS format
string temp = ConvertToDos(sr.ReadToEnd());
sr.Close();
fs.Close();

//Gem tekst fil igen.
FileStream fs2 = new FileStream(resultfile, FileMode.Open);
StreamWriter sw = new StreamWriter(fs2, System.Text.Encoding.ASCII);
sw.Write(temp);
sw.Close();
fs2.Close();

//ConvertToDos
public static string ConvertToDos(string input)
{
    //hex værdier
        input = input.Replace("æ", "E6");
    input = input.Replace("ø", "F8");
    input = input.Replace("å", "E5");
    input = input.Replace("Æ", "C6");
    input = input.Replace("Ø", "D8");
    input = input.Replace("Å", "C5");
    return input;
}

Når jeg så har fjernet danske tegn skal jeg så generere min tekst fil udfra min xsl fil som ses nedenfor

Her har jeg lidt problemer med at lave en korrekt linje skift, som skal indeholde "0D 0A"

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:main="http://rep.oio.dk/ubl/xml/schemas/0p71/maindoc/"
xmlns:com="http://rep.oio.dk/ubl/xml/schemas/0p71/common/"
xmlns:pie="http://rep.oio.dk/ubl/xml/schemas/0p71/pie/"
xmlns:tpcm="http://rep.oio.dk/ubl/xml/schemas/0p71/testpcm/"
xmlns:tpie="http://rep.oio.dk/ubl/xml/schemas/0p71/testpie/"
xmlns:pcm="http://rep.oio.dk/ubl/xml/schemas/0p71/pcm/"
>
<xsl:preserve-space elements="*"/>
<xsl:template match="/">
  <xsl:apply-templates select="/*[local-name()='Invoice']"/>
</xsl:template>

<xsl:template match="pie:Invoice|pcm:Invoice|tpcm:Invoice|pie:Invoice">
    <xsl:text>H01</xsl:text>
    <xsl:apply-templates select="com:TypeCode"/>
    <xsl:apply-templates select="com:ID"/>
    <xsl:apply-templates select="//com:BuyerParty[1]/com:AccountCode"/>
    <xsl:call-template name="SubAccount"/>
    <xsl:call-template name="SellersRef"/>
    <xsl:call-template name="BuyersRef"/>
    <xsl:apply-templates select="com:IssueDate"/>
    <xsl:apply-templates select="com:PaymentMeans/com:PaymentDueDate"/>
    <xsl:call-template name="BuyersOrderID"/>
    <xsl:call-template name="BuyersOrderDate"/>
    <xsl:call-template name="SellersID"/>
    <xsl:call-template name="DeliveryCode"/>
    <xsl:call-template name="PaymentID"/>
    <xsl:call-template name="ReferenceFields"/>
    <xsl:text>&#xA;</xsl:text>
    <xsl:text>&#xD;</xsl:text>
    <!-- Leveringsadresse -->
    <!-- <xsl:text>H02</xsl:text> -->   
    <xsl:apply-templates select="com:InvoiceLine"/>
    <xsl:apply-templates select="com:LegalTotals"/>
    <xsl:text>&#xA;</xsl:text>   
    <xsl:text>&#xD;</xsl:text>
</xsl:template>

<xsl:template match="com:TypeCode">
        <!-- TypeCode er eks. 380_H01 og der skal kun bruges 380, så overskydende fjernes -->
        <xsl:value-of select="substring(//com:TypeCode,1,3)"/>
</xsl:template>

<xsl:template match="com:ID">
        <!-- FakturaNr / KreditorNr-->
        <xsl:value-of select="format-number(.,'00000000')" />
</xsl:template>

<xsl:template match="com:AccountCode">
        <!-- Købers kontonr ved leverandør -->
        <xsl:value-of select="substring(concat(., '          '), 1, 10)" />
</xsl:template>

<xsl:template match="com:IssueDate">
        <!-- Faktura dato -->
        <xsl:variable name='date'><xsl:value-of select="."/></xsl:variable>
        <xsl:value-of select="substring($date,'1','2')"/>
        <xsl:value-of select="substring($date,'3','2')"/>
        <xsl:value-of select="substring($date,'6','2')"/>
        <xsl:value-of select="substring($date,'9','2')"/>
</xsl:template>

<xsl:template match="com:PaymentDueDate">
        <!-- Faktura forfaldsdato -->
        <xsl:variable name='latedate'><xsl:value-of select="."/></xsl:variable>
        <xsl:value-of select="substring($latedate,'1','2')"/>
        <xsl:value-of select="substring($latedate,'3','2')"/>
        <xsl:value-of select="substring($latedate,'6','2')"/>
        <xsl:value-of select="substring($latedate,'9','2')"/>       
</xsl:template>

<xsl:template name="SubAccount">
        <!-- Underkonto -->
        <xsl:text>          </xsl:text><!-- bemærk at denne info ikke eksisterer i xml filen-->
</xsl:template>

<xsl:template name="SellersRef">
        <!-- Sælgers ref -->
        <xsl:text>          </xsl:text><!-- bemærk at denne info ikke eksisterer i xml filen-->
</xsl:template>

<xsl:template name="BuyersRef">
        <!-- Købers ref -->
        <xsl:text>          </xsl:text><!-- bemærk at denne info ikke eksisterer i xml filen-->
</xsl:template>

<xsl:template name="BuyersOrderID">
        <!-- Købers ordrenr - bruges ikke i formatet endnu -->
        <xsl:text>          </xsl:text><!-- bemærk at denne info ikke eksisterer i xml filen-->
</xsl:template>

<xsl:template name="BuyersOrderDate">
        <!-- Købers ordredato - bruges ikke i formatet endnu -->
        <xsl:text>        </xsl:text><!-- bemærk at denne info ikke eksisterer i xml filen-->
</xsl:template>

<xsl:template name="SellersID">
        <!-- Sælgers ordrenr -->
        <xsl:value-of select="substring(concat(//com:InvoiceLine[1]/com:ReferencedOrderLine/com:SellersID, '          '), 1, 10)" />
</xsl:template>

<xsl:template name="DeliveryCode">
        <!-- Lev måde kode -->
        <xsl:text>          </xsl:text><!-- bemærk at denne info ikke eksisterer i xml filen-->
</xsl:template>

<xsl:template name="PaymentID">
        <!-- BetalingsID - bruges ikke i formatet endnu -->
        <xsl:text>                    </xsl:text><!-- bemærk at denne info ikke eksisterer i xml filen-->
</xsl:template>

<xsl:template name="ReferenceFields">
        <!-- Ref felter -->
        <xsl:value-of select="substring(concat(//com:InvoiceLine[1]/com:ReferencedOrderLine/com:SellersID, '                                                                                                    '), 1, 100)" />
        <!--<xsl:text>                                                                                                    </xsl:text>bemærk at denne info ikke eksisterer i xml filen-->
</xsl:template>


<!-- ################################ INVOICELINE ################################### -->


<xsl:template match="com:InvoiceLine">
        <!-- LinjeType -->
        <xsl:text>L01</xsl:text>
       
        <!-- VarenummerArt -->
        <xsl:variable name="varenummerart" select="com:Item/com:SellersItemIdentification/com:ID" />
        <xsl:value-of select="format-number($varenummerart,'00')" />

        <!-- Varenummer (kundens) -->
        <xsl:variable name="varenummer" select="com:Item/com:ID" />
        <xsl:value-of select="substring(concat($varenummer,'                    '), 1, 20)" />
       
        <!-- Varetekst1 -->
        <xsl:variable name="varetekst" select="com:Item/com:Description" />       
        <xsl:value-of select="substring(concat($varetekst,'                                  '), 1, 35)" />

        <!-- Varetekst2 -->
        <xsl:text>                                  </xsl:text>

        <!-- Leveret Enheder -->
        <xsl:variable name="enheder" select="com:InvoicedQuantity" />       
        <xsl:value-of select="format-number($enheder,'0000000000.00')" />

        <!-- Enhed -->
        <xsl:variable name="enhed" select="com:InvoicedQuantity/@unitCode" />       
        <xsl:value-of select="substring(concat($enhed,'  '), 1, 3)" />

        <!-- Pris per enhed FØR evt rabat / Bruttopris -->
        <xsl:variable name="bruttoprisEnhed" select="com:BasePrice/com:PriceAmount" />   
        <xsl:value-of select="format-number($bruttoprisEnhed,'0000000000.00')" />

        <!-- Pris per enhed EFTER evt rabat / Nettopris-->
        <xsl:variable name="nettoprisEnhed" select="com:BasePrice/com:PriceAmount" />
        <xsl:value-of select="format-number($nettoprisEnhed,'0000000000.00')" />
       
        <!-- Rabat kode - denne er altid 0 da der altid leveres en rabat proces, se dokumentation for mere info-->
        <xsl:text>0</xsl:text>
       
        <!-- Rabat beløb SKAL RETTES!!!!! -->
        <xsl:value-of select="format-number(0000000000000,'0000000000.00')" />
       
        <!-- Linjesum brutto -->
        <xsl:variable name="linjesumbrutto" select="com:Note" />       
        <xsl:value-of select="format-number($linjesumbrutto,'0000000000.00')" />
       
        <!-- Linjesum netto -->
        <xsl:variable name="linjesumnetto" select="com:LineExtensionAmount" />       
        <xsl:value-of select="format-number($linjesumnetto,'0000000000.00')" />
       
        <!-- Antal længder -->
        <xsl:text>    </xsl:text>

        <!-- Meter pr længde -->
        <xsl:value-of select="format-number('00','00.00')" />       
       
        <!-- Købers ordrelin ref -->
        <xsl:text>                </xsl:text>       
       
        <!-- Prisfaktor -->
        <xsl:variable name="prisfaktor" select="com:Item/com:BasePrice/com:BaseQuantity" />       
        <xsl:value-of select="format-number($prisfaktor,'000000')" />
       
        <!-- Linjeskift -->
        <xsl:text>&#xA;</xsl:text>
</xsl:template>

<xsl:template match="com:LegalTotals">
        <!-- LinjeType -->
        <xsl:text>S01</xsl:text>
       
        <!-- Fakturasum, beloeb uden moms-->
        <xsl:value-of select="format-number(//com:LegalTotals/com:LineExtensionTotalAmount,'0000000000.00')" />
       
        <!-- moms beloeb -->
        <xsl:value-of select="format-number(//com:TaxTotal/com:TaxAmounts/com:TaxAmount,'0000000000.00')"/>
       
        <!-- beloeb total inkl moms-->
        <xsl:value-of select="format-number(//com:LegalTotals/com:ToBePaidTotalAmount,'0000000000.00')"/>
</xsl:template>

</xsl:stylesheet>
Avatar billede arne_v Ekspert
25. maj 2005 - 15:05 #1
ASCII indeholder ikke danske bogstaver - derfor er det definitorisk
umuligt at udskrive danske bogstaver i ASCII

det tegnsæt du replacer til er vist ikke DOS (CP-850) men snarere
Windows (CP-1252 alias ISO-8859-1)

prøv at droppe ConvertToDos metoden total og så udskrive med Encoding.Default
Avatar billede mungojerrie Nybegynder
25. maj 2005 - 15:15 #2
så du mener jeg slet ikke skal åbne og lukke txtfilen igen, men bare gemme mit xml doc med Encoding.Default  ??
Avatar billede mungojerrie Nybegynder
25. maj 2005 - 15:18 #3
ups, jeg mener selvfølgelig xml filen og ikke txt filen
Avatar billede arne_v Ekspert
25. maj 2005 - 15:38 #4
XmlTextWriter writer = new XmlTextWriter(fileStream, System.Text.Encoding.Default);

og drop alt resten med at læse ind og skrive ud igen
Avatar billede mungojerrie Nybegynder
26. maj 2005 - 08:22 #5
hmm, det ser ikke ud til at løse mit problem, der er stadig danske bogstaver i min txt fil........det samme er der i min xml fil.....
Avatar billede arne_v Ekspert
26. maj 2005 - 08:31 #6
skulle du ikke have danske bogstaver ??
Avatar billede mungojerrie Nybegynder
26. maj 2005 - 08:51 #7
hmm, de danske bogstaver skal i hvert fald leveres med deres ascii værdier:
æ = 145
ø = 155
å = 134
Æ = 146
Ø = 157
Å = 143

jf min dokumentation til formatet....
Avatar billede arne_v Ekspert
26. maj 2005 - 09:02 #8
det er da ikke de konstanter du bruger i:

public static string ConvertToDos(string input)
{
    //hex værdier
        input = input.Replace("æ", "E6");
    input = input.Replace("ø", "F8");
    input = input.Replace("å", "E5");
    input = input.Replace("Æ", "C6");
    input = input.Replace("Ø", "D8");
    input = input.Replace("Å", "C5");
    return input;
}

??
Avatar billede arne_v Ekspert
26. maj 2005 - 09:02 #9
men anyway - prøv så:

Encoding.GetEncoding(850)
Avatar billede mungojerrie Nybegynder
26. maj 2005 - 09:04 #10
nej, det har du ret i, men det skulle være de hexadecimale værdier....
prøver lige Encoding.GetEncoding(850)
Avatar billede mungojerrie Nybegynder
27. maj 2005 - 13:11 #11
Encoding.GetEncoding(850) duer jo bare.....smid lige et svar :-)
Avatar billede mungojerrie Nybegynder
07. juni 2005 - 13:58 #12
ville du smide et svar arne ?
Avatar billede mungojerrie Nybegynder
09. juni 2005 - 15:32 #13
så må jeg jo selv svare....
Avatar billede arne_v Ekspert
22. juni 2005 - 22:10 #14
jeg har ligesom alle andre ikke fået email fra Eksperten i 3 uger ...
Avatar billede mungojerrie Nybegynder
23. juni 2005 - 14:33 #15
okay, jeg skal da gerne oprette et nyt spg med point til dig :-)
Avatar billede arne_v Ekspert
23. juni 2005 - 16:16 #16
det ville da være pænt

:-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester