Avatar billede martinmmn Nybegynder
23. august 2002 - 09:54 Der er 9 kommentarer

Problemer med linieskift på text output

Hej,

Jeg forsøger at konvertere en xml-fil til text. Men i resultatet er der linie skift ved hver xsl-tag. Jeg vil gerne have, at der kun skiftes linie for hvert "hoved"-element. Eksempelvis:
XML fil:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="konverter_til_text.xsl"?>
<productList>
    <product>
        <ID>a</ID>
        <text>her er en cd</text>
        <extendedText>med lang tekst</extendedText>
        <price>14,45</price>
        <support>A</support>
        <category1>1</category1>
        <supplier>Sony</supplier>
    </product>
    <product>
        <ID>b</ID>
        <text>her er en cd mere </text>
        <extendedText>med endnu længere tekst</extendedText>
        <price>15,50</price>
        <support>B</support>
        <category1>2</category1>
        <supplier>Sony</supplier>
    </product>
</productList>

Her XSL som den ser ud nu:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="text" encoding="ISO-8859-1"/>
    <xsl:template match="/">
        <xsl:apply-templates/>
    </xsl:template>
    <xsl:template match="productList">
        <xsl:text>Beskrivelse (lang);Pris enhed;Leveringstid;Lev varenr;Beskrivelse (kort);Klassificeringsnummer;Selskab &#xa;</xsl:text>
        <xsl:apply-templates select="product"/>
    </xsl:template>
    <xsl:template match="product">
                    <xsl:value-of select="concat(extendedText,';',price,';')"/>
        <xsl:choose>
            <xsl:when test="self::node()[support='A']">10;</xsl:when>
            <xsl:when test="self::node()[support='B']">21;</xsl:when>
            <xsl:otherwise>NA;</xsl:otherwise>
        </xsl:choose>
        <xsl:value-of select="concat(ID,';',text,';')"/>
        <xsl:choose>
            <xsl:when test="self::node()[category1='1']">111111111;</xsl:when>
            <xsl:when test="self::node()[category1='2']">222222222;</xsl:when>
            <xsl:otherwise>NA;</xsl:otherwise>
        </xsl:choose>
        <xsl:value-of select="supplier"/>
    </xsl:template>
</xsl:stylesheet>

Her er reslutatet:
Beskrivelse (lang);Pris enhed;Leveringstid;Lev varenr;Beskrivelse (kort);Klassificeringsnummer;Selskab
med lang tekst;14,45;10;a;her er en cd;111111111;Sonymed endnu længere tekst;15,50;21;b;her er en cd mere ;222222222;Sony

Og her eksmpel på, hvordan jeg ønsker den:
Beskrivelse (lang);Pris enhed;Leveringstid;Lev varenr;Beskrivelse (kort);Klassificeringsnummer;Selskab

med lang tekst;14,45;10;a;her er en cd;111111111;Sony

med endnu længere tekst;15,50;21;b;her er en cd mere ;222222222;Sony



Håber der er nogen der kan hjælpe til, hvordan jeg skal forme min XSL
Avatar billede janegil Nybegynder
23. august 2002 - 11:06 #1
http://www.w3.org/TR/xslt#section-Text-Output-Method

Ettersom det er tekst du skal generere, burde det være en god idé å spesifisere text output method. Jeg vet ikke om det hjelper, men det virker fornuftig at HTML og XML output lager whitespace som gjør koden mer lettlest for et menneske - whitespace har jo likevel ingen semantisk betydning i XML/HTML.
Avatar billede Slettet bruger
23. august 2002 - 14:29 #2
Æææh janegil >>> Er det ikke det han gør :-) ?
Avatar billede janegil Nybegynder
23. august 2002 - 14:35 #3
Ja, selvfølgelig! Jeg må ha lest starten av XMLen, og trodd det var XSL? (eller jeg er bare dum og doven...)

Så er det kanskje på tide å forske i hvilken software det er som kjører transformasjonen? Prøve IE6, Mozilla, Sablotron...
Avatar billede martinmmn Nybegynder
26. august 2002 - 14:17 #4
Jeg bruger IE6. Jeg har også prøvet XTrans og der er det bare en lang streng (???)
Hvis ikke jeg bruger concat i <xsl:value-of select/> med laver en <xsl:value-of select/> for hvert "select", ekspempelvis <xsl:value-of select="ID"/>;<xsl:value-of select="text"/>;
foretages der linieskift således:
ID
;
text
;

Er der ingen der kender en slags "concat" på et "højere niveau" så den ikke gennemtvinger linieskift ved hver <xsl:choose>?
Avatar billede janegil Nybegynder
27. august 2002 - 09:23 #5
Hvis du ellers kan leve med XTrans, så synes jeg det med én lang streng lyder lovende. For så skal du vel legge inn CR og/eller LF som character entities der du vil ha dem? Er det ikke &#x0A; for line feed og &#x0D; for carriage return?
Avatar billede martinmmn Nybegynder
27. august 2002 - 16:30 #6
Hej janegil,
Jeg ville meget gerne at det virker i IE6, men ellers tak ;-)
Avatar billede janegil Nybegynder
28. august 2002 - 13:01 #7
Hva med <strip-space elements="product"/> ?

http://www.w3.org/TR/xslt#strip - har ikke lest den selv, Færøyene er nokså off-line i dag, CANTAT er nede.
Avatar billede wiscalico Nybegynder
26. september 2002 - 16:13 #8
Jeg har haft det samme problem (så vidt jeg har forstået) og fandt svaret i et tidligere spørgsmål her på Eksperten.
Jeg løste det på følgende måde (Lidt slam agtig syntes jeg men det virkede i det mindste :-) )
        ....
        <xsl:value-of select="supplier"/><xsl:text disable-output-escaping="yes">
</xsl:text>
    </xsl:template>
    ....

Håber det kan bruges det hjalp mig i hvert tilfælde.
Avatar billede wiscalico Nybegynder
26. september 2002 - 16:14 #9
Bemærk linieskiftet:
<xsl:text disable-output-escaping="yes"> <-- LINIESKIFT HER
</xsl:text>
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