[XML] Breaks in XML data

Pagina: 1
Acties:
  • 447 views sinds 30-01-2008
  • Reageer

  • Rhapsody
  • Registratie: Oktober 2002
  • Laatst online: 23:23

Rhapsody

In Metal We Trust

Topicstarter
Goedemiddag allen,

Ik heb een probleempje met een XML file. Ik heb een willekeurig XML bestand, dat middels een XSL bestand wordt gestyled. Nu heb ik in de XML data staan wat enkele regeleindes bevat.

Alleen dat wordt dus niet overgenomen. Op internet heb ik veel sites gevonden waar men dezelfde problemen heeft/had, maar nergens staat een oplossing.

Heet een van jullie toevallig een idee?

Alvast bedankt.

🇪🇺 pro Europa! | Puinhoop Veroorzaken en Vertrekken (PVV)


  • TheNameless
  • Registratie: September 2001
  • Laatst online: 07-02 21:38

TheNameless

Jazzballet is vet!

Heb je hier al naar gekeken?
XML:
1
<xsl:value-of select="" disable-output-escaping="yes"/>

Ducati: making mechanics out of riders since 1946


  • ikke007
  • Registratie: Juni 2001
  • Laatst online: 18-09 14:10
Staan je regeleindes in attributen van de xml of in de waarden? (<elem attrib="ik
heb
enter"/>

of <elem>ik
heb
enter
</elem>

Volgens de specificaties van XML hoeft deze namelijk geen 'waarde' te hechten aan enters in attributen. Hier zul je dan ook geen oplossing behalve handwerk voor vinden. (En indien je het op de een-of-andere manier wel voor elkaar krijgt -> let me know!)

Indien de enters in de waarden zitten kun je de xsl parser vertellen dat enters van waarde zijn en preserved moeten worden - ik meen mij te herrineren door gebruik van <xsl:preserve-space elements="elem"/> als direct kind binnen je xsl:stylesheet>

Lets remove all security labels and let the problem of stupidity solve itself


  • Rhapsody
  • Registratie: Oktober 2002
  • Laatst online: 23:23

Rhapsody

In Metal We Trust

Topicstarter
TheNameless schreef op donderdag 23 november 2006 @ 12:21:
Heb je hier al naar gekeken?
XML:
1
<xsl:value-of select="" disable-output-escaping="yes"/>
Ja die optie had ik ook gevonden, maar dat lijkt niets uit te maken.
Overigens moet ik bij select="" wel wat invullen, anders krijg ik een 'expression expected' error.

Mijn data is dus alsvolgt:
<message>regel 1<br />regel 2</message>

Maar in IE (7) wordt dit weergegeven als "regel 1 regel 2"

🇪🇺 pro Europa! | Puinhoop Veroorzaken en Vertrekken (PVV)


  • Rhapsody
  • Registratie: Oktober 2002
  • Laatst online: 23:23

Rhapsody

In Metal We Trust

Topicstarter
ikke007 schreef op donderdag 23 november 2006 @ 12:25:
Staan je regeleindes in attributen van de xml of in de waarden? (<elem attrib="ik
heb
enter"/>

of <elem>ik
heb
enter
</elem>

Volgens de specificaties van XML hoeft deze namelijk geen 'waarde' te hechten aan enters in attributen. Hier zul je dan ook geen oplossing behalve handwerk voor vinden. (En indien je het op de een-of-andere manier wel voor elkaar krijgt -> let me know!)

Indien de enters in de waarden zitten kun je de xsl parser vertellen dat enters van waarde zijn en preserved moeten worden - ik meen mij te herrineren door gebruik van <xsl:preserve-space elements="elem"/> als direct kind binnen je xsl:stylesheet>
Het gaat om enters in de waarden.

De preserve-space lijkt ook niets uit te maken helaas.

🇪🇺 pro Europa! | Puinhoop Veroorzaken en Vertrekken (PVV)


  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Je zou een identity transform kunnen toevoegen aan je templates, maar dan moet dat wel passen binnen wat er verder allemaal in je XML staat... Het makkelijkst is waarschijnlijk om gewoon een br-template toe te voegen (en zorgen dat je apply-templates gebruikt binnen de tags waar die voor kan komen).

Rustacean


  • Rhapsody
  • Registratie: Oktober 2002
  • Laatst online: 23:23

Rhapsody

In Metal We Trust

Topicstarter
@Manuzhai, dat lijkt idd de enige oplossing:

code:
1
<xsl:apply-templates select="message"/>


code:
1
2
3
4
   <message>
        regel 1<br /> 
        regel 2
   </message>


Het volgende probleem is nu dat de MSXML DOM object de < en > van de <br /> vervangt door < en > equivalenten....
Maar ik ben er bijna ! :D

🇪🇺 pro Europa! | Puinhoop Veroorzaken en Vertrekken (PVV)


  • TheNameless
  • Registratie: September 2001
  • Laatst online: 07-02 21:38

TheNameless

Jazzballet is vet!

Rhapsody schreef op donderdag 23 november 2006 @ 12:26:
[...]
Ja die optie had ik ook gevonden, maar dat lijkt niets uit te maken.
Overigens moet ik bij select="" wel wat invullen, anders krijg ik een 'expression expected' error.

Mijn data is dus alsvolgt:
<message>regel 1<br />regel 2</message>

Maar in IE (7) wordt dit weergegeven als "regel 1 regel 2"
Ja dat is logisch natuurlijk. Die <br/> is ook gewoon geldige XML.

Kijk hier eens:
http://www.w3schools.com/xml/xml_cdata.asp

Ducati: making mechanics out of riders since 1946


  • Rhapsody
  • Registratie: Oktober 2002
  • Laatst online: 23:23

Rhapsody

In Metal We Trust

Topicstarter
TheNameless schreef op donderdag 23 november 2006 @ 12:57:
[...]

Ja dat is logisch natuurlijk. Die <br/> is ook gewoon geldige XML.

Kijk hier eens:
http://www.w3schools.com/xml/xml_cdata.asp
Ja ik weet dat het logische XML is, maar waarom geeft ie het dan niet als een regeleinde weer?

🇪🇺 pro Europa! | Puinhoop Veroorzaken en Vertrekken (PVV)


  • TheNameless
  • Registratie: September 2001
  • Laatst online: 07-02 21:38

TheNameless

Jazzballet is vet!

Omdat de <br> tag niets betekend in XSLT of XML, alleen in HTML. :)
Zodra de XSLT engine de <br> tag tegenkomt gaat hij kijken of daar een template voor gedefinieerd is, maar dat is er niet, dus slaat hij de tag gewoon over.

Zoals Manuzhai al zegt, om hier wel iets van betekening aan te geven, zou je een template moeten definiëren voor de <br> tag.

Maar als je de kans hebt om je XML aan te passen dan zou ik dat doen en dan doen zoals het eigenlijk hoort, en dat is om het in een CDATA tag te zetten.

Ducati: making mechanics out of riders since 1946


Acties:
  • 0 Henk 'm!

Verwijderd

Ik heb hetzelfde probleem, maar begrijp de oplossing nog niet zo goed.

Moet in de XML de CDATA tag bruiken om \n er in te laten of om de <br /> gewoon te laten staan?
Dus <![CDATA[<br/>]]> of <![CDATA[\n]]> of <![CDATE[&#10]]??

XML met XSL is geen HTML dus volgens mij heeft zorgt <br /> niet voor een linebreak. Maar ik wil toch dat de data uit met XSL de nieuwe regels krijgt.

Acties:
  • 0 Henk 'm!

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
Misschien heb je hier wat aan, een nl2br() functie in XSLT.

Voorbeeld XML:
XML:
1
2
3
4
5
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <content>Hallo
    Tweakers</content>
</root>

En de XSLT:
XML:
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
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" omit-xml-declaration="yes"/>
    <xsl:template match="/">       
        <xsl:call-template name="nl2br"> <!-- aanroepen functie/template met parameter -->
            <xsl:with-param name="text" select="root/content"/>
        </xsl:call-template>
    </xsl:template>
    
    <!-- nl2br() functie -->
    <xsl:template name="nl2br">
        <xsl:param name="text" select="."/>
        <xsl:choose>
            <xsl:when test="contains($text, '&# 10;')"> <!-- &# 10; is de newline die moet worden omgezet -->
                <xsl:if test="string-length(substring-before($text, '&# 10;')) > 0">
                    <xsl:value-of select="substring-before($text, '&# 10;')"/>
                </xsl:if>
                <br />
                <xsl:call-template name="nl2br">
                    <xsl:with-param name="text" select="substring-after($text,'&# 10;')"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:if test="string-length($text) > 0">
                    <xsl:value-of select="$text"/>
                </xsl:if>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

Werkt uitstekend op OS X en Linux, niet getest op Windows.

Doe er je voordeel mee.

Resultaat in oXygen:
code:
1
Hallo<br/>    Tweakers


Edit: &# 10; moet je schrijven ZONDER spatie tussen # en de 1, Tweakers maakt er een zootje van... :(

Edit: Helaas, werkt ook niet, ik hou het op de &# 10; met overbodige spatie :? :?

[ Voor 6% gewijzigd door cariolive23 op 04-04-2009 22:59 . Reden: valt dus tegen... :? Spaties mag je zelf even verwijderen ]


Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 20:50

Sebazzz

3dp

cariolive23 schreef op zaterdag 04 april 2009 @ 22:17:
Edit: &# 10; moet je schrijven ZONDER spatie tussen # en de 1, Tweakers maakt er een zootje van... :(
Dat is geen bug, dat is een feature:
code:
1
2
3
4
5
6
7
[*] 

[*] &amp;#10;
[*] [norml]
[/norml]
[*] [nohtml]
[/nohtml]

Resulteert in:

• &#10;
• &#10;
• &#10;

[ Voor 3% gewijzigd door Sebazzz op 04-04-2009 22:53 ]

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 20:48

Patriot

Fulltime #whatpulsert

Verwijderd schreef op zaterdag 04 april 2009 @ 16:06:
Ik heb hetzelfde probleem, maar begrijp de oplossing nog niet zo goed.

Moet in de XML de CDATA tag bruiken om \n er in te laten of om de <br /> gewoon te laten staan?
Dus <![CDATA[<br/>]]> of <![CDATA[\n]]> of <![CDATE[&#10]]??

XML met XSL is geen HTML dus volgens mij heeft zorgt <br /> niet voor een linebreak. Maar ik wil toch dat de data uit met XSL de nieuwe regels krijgt.
Alles in de tag waarin de <br />'s staan moet je tussen de CDATA tags zetten. Zoiets dus:

XML:
1
2
3
4
<?xml version="1.0" encoding="UTF-8">
<root>
 <element><![CDATA[Tekst met een<br />nieuwe regel!]]></element>
</root>
Pagina: 1