XML/XSLT hoe krijg ik die newlines weg?

Pagina: 1
Acties:

  • youngster
  • Registratie: Maart 2004
  • Laatst online: 20-05-2025
Ik heb een xmlletje waar ik een xslletje op los laat dat er zo uit ziet:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/MSG">
        <MESSAGES-OUT>
            <resources>
                <resource>
                    <comm_code><xsl:value-of select="resources/resource/comm_code"/></comm_code>
                </resource>
            </resources>
            <messages>
                <xsl:for-each select = "stop">
                    <xsl:for-each select = "planactions/planaction">
                        <xsl:if test ="count(kind) &gt; 0">
                            <messagebody>
                                <xsl:call-template name="getHeader" />
                                <xsl:value-of select="kind"/>þ
                                <xsl:if test="kind = 'deliver' or kind = 'pickup'">
                                    <xsl:call-template name="pick_deliver" />
                                </xsl:if>
                                <xsl:if test="kind = 'couple' or kind = 'decouple'">
                                    <xsl:call-template name="couple_decouple" />
                                </xsl:if>
                            </messagebody>
                        </xsl:if>   
                    </xsl:for-each>
                </xsl:for-each>
            </messages>
        </MESSAGES-OUT>
    </xsl:template>

    <xsl:template name="pick_deliver">
        <xsl:value-of select="planned-starttime"/>þ
        þ
        <xsl:value-of select="ancestor::node()/trip/id"/>þ
        <xsl:value-of select="id"/>þ
        <xsl:value-of select="order_number"/>þ
        <xsl:value-of select="product_name"/>þ
        <xsl:call-template name="getAmount" />
        <xsl:value-of select="destination"/>þ
        þ
    </xsl:template>
    
    <xsl:template name="couple_decouple">
        <xsl:value-of select="planned-starttime"/>þ
        þ
        <xsl:value-of select="ancestor::node()/trip/id"/>þ
        <xsl:value-of select="id"/>þ
        <xsl:value-of select="order_number"/>þ
        <xsl:value-of select="vlootnr"/>þ
        <xsl:value-of select="bak1"/>þ
        <xsl:value-of select="bak2"/>þ
        þ
    </xsl:template>
        
    <xsl:template name="getHeader">028000                1234                                                             &#xD;
    </xsl:template>
    
    <xsl:template name="getAmount">
        <xsl:value-of select="amounts/amount[2]/value"/>þ
        PLþ
    </xsl:template>

</xsl:stylesheet>


Nu krijg ik hier (verkort) de volgende xml uit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<messagebody>
        028000                1234                                                             

    pickupþ
                                2005-02-16T09:12:34þ
        þ
        þ
        10þ
        FABRIEK HARDERWIJKþ
        33341þ
        þ
        HARDERWIJKþ
    00212205þ
        STENEN &amp; BLOKKENþ
        15000þ
        PLþ
    ROTTERDAMþ
        þ
    </messagebody>


Echter wil ik behalve de eerste regel alles op één regel hebben gescheiden door die gekke þ dingen.
Ik wil namelijk gewoon de hele <messagebody> er uit pakken en in een ascii file wegschrijven. Maar die xsl gooit alles op een nieuwe regel. En ik wil eigenlijk niet bij het wegschrijven gaan filteren op newlines...

Iemand enig idee hoe ik dit voor elkaar krijg en tevens m'n xslt leesbaar houdt?

Edit: Gebruik de MSXML engine

[ Voor 21% gewijzigd door youngster op 15-02-2005 12:11 ]

Real programmers don't comment their code... it was hard to write, it should be hard to read!


  • Juup
  • Registratie: Februari 2000
  • Niet online
Welke XSLT transformer/toolkit gebruik je? Soms kun je een speciale commentaar regel toevoegen om aan te geven wat je met space/newlines/indentation wil doen.

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
mischien werkt het als je <xsl:strip-space elements="*"/> toevoegt binnen de root. Anders moet je even kijken of je je parser zo in kan stellen dat ie dit al automatisch doet.

Noushka's Magnificent Dream | Unity


  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
als je toch als output maar 1 <messagebody /> hebt met daarin rauwe ascii die je weer wilt verwerken, waarom laat je die messagebody dan ook niet gewoon weg en doe je:

code:
1
<xsl:output method="text" indent="no" />

  • youngster
  • Registratie: Maart 2004
  • Laatst online: 20-05-2025
@Michali: Helaas maakt strip-space geen enkel verschil

@Genoil:
Ten eerste heeft dat volgens mij niets met het probleem te maken want dan houd ik nog steeds die newlines.
Ten tweede, kunnen er tig messagebody's in een bericht staan die ik allemaal in een apart bestandje wil wegschrijven. (wat ik nu dus vanuit mijn app doe, die nu gewoon de inhoud van <messagebody> pakt en wegschrijft.

Real programmers don't comment their code... it was hard to write, it should be hard to read!


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Als xsl:strip-space niet werkt zit er volgens mij niet veel anders op dan te concluderen dat de xslt engine die je gebruikt je helaas verplicht om de stylesheet aan de opmaak van je result-tree onderhevig te stellen.

En nou in normaal nederlands: je moet dan in de stylesheet alle overbodige spaces weghalen. D'r zit niet veel anders op als xsl:strip-space niet werkt.

Misschien zou je ook eens kunnen kijken naar formatting objects. Zie http://www.w3.org/TR/xsl/slice6.html#fo-section

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Je moet die þ dingen tussen <xml:text> tags zetten.

Aldus:

<xml:text>þ</xml:text>

want zoals het nu in je StyleSheet staat, zeg je eigenlijk tegen de processor dat 'ie als ouput moet genereren þ gevolgd door een CR...
(er staat namelijk echt een CR achter elke þ)

Dit is trouwens een FAQ getiteld "too much whitespace".

OT: ik vind het niet echt een mooie stylesheet, vooral het gebruik van for-each ben ik een beetje allergisch voor. Meestal betekent het dat je niet echt begrijpt wat een Template is. No offence, alle begin is moeilijk.

Oh, nog wat, deze constructie is ook niet echt handig (hoewel 'ie wel werkt ...):
<xsl:if test ="count(kind) > 0">
Zoek eens in de FAQ's op "test for node existence" - het kan veel mooier.
Is trouwens die hele IF niet overbodig als je een apart template maakt voor 'kind' ?
Daarvoor zou ik de input XML eens moeten zien...

zo, genoeg gezeurd voor één post.
Pagina: 1