[XML/XSL] Choose/When Probleem

Pagina: 1
Acties:

  • didio
  • Registratie: Maart 2001
  • Laatst online: 01-04 09:19

didio

didio.nl

Topicstarter
Terwijl ik XML/XSL toch aardig onder de knie begin te krijgen kom ik hier nu ff niet uit.

Ik heb een XML file:
code:
1
2
3
4
5
6
7
8
<TEST>
  <DATA>
    <SALE>False</SALE> 
  </DATA>
  <DATA>
    <SALE>True</SALE> 
  </DATA>
</TEST>

En ik heb een XSL file waar ik een Choose When testje doe.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:include href="html.xsl"/>
  <xsl:output method="html"/>

  <xsl:template match="TEST">
    <xsl:apply-templates select="SALE"/>
  </xsl:template>

  <xsl:template match="SALE">
    <xsl:choose>
    <xsl:when test="SALE='True'">
        Yes we have a sale
    </xsl:when>
    <xsl:otherwise>
        <xsl:value-of select="."/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

Ik krijg hier nu dus altijd false door terwijl er ook sales op True staan. Als de waarde False is print ik de waarde van SALE op het scherm en zet ie toch weer True neer.

Iemand?

weinig tot niks..


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
didio: Terwijl ik XML/XSL toch aardig onder de knie begin te krijgen kom ik hier nu ff niet uit.
Kan altijd gebeuren ;) .

Ik doe het even uit mijn hoofd, want kan nu niet testen..

Als je percee choose-when wilt gebruiken moet je denk ik dit doen:
code:
1
2
3
4
5
6
7
8
9
10
  <xsl:template match="SALE">
    <xsl:choose>
    <xsl:when test="text()='True'">
        Yes we have a sale
    </xsl:when>
    <xsl:otherwise>
        <xsl:value-of select="."/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

Je zit namelijk al in SALE :) . Je kreeg geen melding omdat XSL erg (on)vriendelijk is. Hij zeurt vaak niet over knopen die niet bestaan.

Maar, dit is absoluut niet de makkelijkste manier. Bekijk dit maar eens :) .
code:
1
2
3
4
5
6
7
  <xsl:template match="SALE[text() = 'True']">
    Yes we have a sale
  </xsl:template>

  <xsl:template match="SALE[text() = 'False']">
    No, we don't have sale
  </xsl:template>

Je kan dus in je match attribuut voorwaarden opnemen. Voor meer uitleg kan je in de XPath standaard kijken, want het zijn gewoon XPath expressies.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • didio
  • Registratie: Maart 2001
  • Laatst online: 01-04 09:19

didio

didio.nl

Topicstarter
Damn, het werkt allebei niet..

In het tweede voorbeeld zou je toch zeggen dat mijn probleem dan met de text voor False op de proppen moet komen, maar hij laat dan helemaal niets meer zien.

Ik denk ook dat daar het probleem zit, maar toch blijft het raar dat als ik gewoon de value uitprint op het scherm dat er wel gewoon True en False staat..

weinig tot niks..


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
didio: Damn, het werkt allebei niet..
Hum vervelend... Ik ben nu niet thuis dus ik kan het helaas niet testen. Meestal haal ik het even door JAX/Xalan omdat die vrij precies is... Ik zie mezelf zo geen fout maken, maar vanavond kan JAX me beoordelen ;) .

Wat voor engine gebruik je? Sablenogwat, IE6, Mozilla?

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • didio
  • Registratie: Maart 2001
  • Laatst online: 01-04 09:19

didio

didio.nl

Topicstarter
Op vrijdag 16 november 2001 15:54 schreef mbravenboer het volgende:

[..]
Wat voor engine gebruik je? Sablenogwat, IE6, Mozilla?
IE6 en ik heb MSXML 4.0 installed..
Maar het lullige is dat ik ergens anders net zoiets doe en daar werkt het wel, volgens mij zijn er geen verschillen maar het zal wel weer een klein dingetje zijn..

weinig tot niks..


  • Rense Klinkenberg
  • Registratie: November 2000
  • Laatst online: 15-09 23:45
Op vrijdag 16 november 2001 15:54 schreef mbravenboer het volgende:Wat voor engine gebruik je? Sablenogwat, IE6, Mozilla?
't blijft een moeilijke naam hè :) Maar 't is gewoon 'Sabletron', of kortweg gezegd 'Sablot'.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
didio: IE6 en ik heb MSXML 4.0 installed..
Maar het lullige is dat ik ergens anders net zoiets doe en daar werkt het wel, volgens mij zijn er geen verschillen maar het zal wel weer een klein dingetje zijn..
Helaas werkt het hier ook prima (2e oplossing)... Je kan er dan wel vanuit gaan dat het goede XSLT is. Omdat het bovedien vrij triviaal is, vraag ik me wel af wat er mis is met IE6...
freak007: 't blijft een moeilijke naam hè :) Maar 't is gewoon 'Sabletron', of kortweg gezegd 'Sablot'.
Thanks ;) . Ik zal proberen het nu te onthouden :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • brammetje
  • Registratie: Oktober 2000
  • Laatst online: 12-01-2025
ik heb het allemaal even samengesteld voor je :)
xml:
code:
1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<test>
  <data>
    <sale>False</sale> 
  </data>
  <data>
    <sale>True</sale> 
  </data>
</test>

xsl:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output
    method="html"
    indent="yes"
    encoding="utf-8"/>
  
  <xsl:template match="test">
    <xsl:apply-templates/>
  </xsl:template>

  <xsl:template match="sale[text() = 'True']">
    Yes we have a sale
  </xsl:template>
  <xsl:template match="sale[text() = 'False']">
    No, we don't have sale
  </xsl:template>


</xsl:stylesheet>

en dit werkt bij mijn IE 6.0 goed.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
PlayR: ik heb het allemaal even samengesteld voor je :)
Je bent te goed ;) . Die kleine letters lucht ook wel op trouwens :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • brammetje
  • Registratie: Oktober 2000
  • Laatst online: 12-01-2025
Op vrijdag 16 november 2001 22:22 schreef mbravenboer het volgende:
Je bent te goed ;)
ik weet het, ik weet het ;)
Die kleine letters lucht ook wel op trouwens :) .
Jaha, ik ben er erg trots op :)

  • Rense Klinkenberg
  • Registratie: November 2000
  • Laatst online: 15-09 23:45
Op vrijdag 16 november 2001 22:22 schreef mbravenboer het volgende:Die kleine letters lucht ook wel op trouwens :) .
HOOFDLETERS rouleren!. Dan kan je de spelfouten in de xml van je buurman eerder zien, wat weer een boel debugging scheelt :P

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

ik heb ook problemen met xslt in IE die gewoon perfect werkt in Mozilla ;(

  • didio
  • Registratie: Maart 2001
  • Laatst online: 01-04 09:19

didio

didio.nl

Topicstarter
Op vrijdag 16 november 2001 21:59 schreef PlayR het volgende:
ik heb het allemaal even samengesteld voor je :)
</xsl:stylesheet>[/code]
en dit werkt bij mijn IE 6.0 goed.
Als ik dit zo run in IE werkt het ook, natuurlijk waren die voorbeelden die ik gaf snippets uit mijn meters lange code. Daar werkt het dus nog steeds niet. :(

weinig tot niks..


  • brammetje
  • Registratie: Oktober 2000
  • Laatst online: 12-01-2025
Op zondag 18 november 2001 13:41 schreef didio het volgende:

[..]

Als ik dit zo run in IE werkt het ook, natuurlijk waren die voorbeelden die ik gaf snippets uit mijn meters lange code. Daar werkt het dus nog steeds niet. :(
dan zit het foutje dus ergens anders in :) (lijkt me zo..)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Misschien is het handig om eens stand-alone engine te gebruik om stylesheets te testen. Het gedrag van IE6 en Mozilla is vaak onduidelijk en meldingen krijg je al helemaal niet.

Als je Java 2 Standard Edition 1.4.0 beta 3 download en installeert krijg je daar gratis een XSL processor bij. Door middel van een heel simpel tooltje kan je op de command-prompt transformeren. Als er fouten in zitten krijg je een melding. Deze is niet altijd even duidelijk, maar meestal geeft het toch goed aan waar het probleem zit.
Als je dit gaat gebruiken, kan ik mijn tooltje wel even online zetten.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • brammetje
  • Registratie: Oktober 2000
  • Laatst online: 12-01-2025
Op zondag 18 november 2001 15:08 schreef mbravenboer het volgende:
Misschien is het handig om eens stand-alone engine te gebruik om stylesheets te testen. Het gedrag van IE6 en Mozilla is vaak onduidelijk en meldingen krijg je al helemaal niet.
Ik vind dat IE 6 meestal nog wel aardig aangeeft waar ik fout zit hoor.. (maarja, jij gebruikt natuurlijk mozilla :) )

  • didio
  • Registratie: Maart 2001
  • Laatst online: 01-04 09:19

didio

didio.nl

Topicstarter
Op zondag 18 november 2001 14:45 schreef PlayR het volgende:

[..]

dan zit het foutje dus ergens anders in :) (lijkt me zo..)
Hahaha daar was ik ook al achter, nu nog ff zoeken, maar meestal kom ik er wel uit en is het alleen een kwestie van tijd.

weinig tot niks..


  • didio
  • Registratie: Maart 2001
  • Laatst online: 01-04 09:19

didio

didio.nl

Topicstarter
Op zondag 18 november 2001 15:08 schreef mbravenboer het volgende:
Als je dit gaat gebruiken, kan ik mijn tooltje wel even online zetten.
Als je dat zou willen doen, kan ik het een proberen.

weinig tot niks..


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
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
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerConfigurationException;

import java.io.FileOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class JAXTransform
{
    public static void main(String[] args)
    {
        if(args.length < 3)
        {
            printUsage();
            System.exit(0);
        }

        try
        {
            TransformerFactory tFactory = TransformerFactory.newInstance();
            Transformer transformer = tFactory.newTransformer(new StreamSource(args[1]));
            transformer.transform(new StreamSource(args[0]), new StreamResult(new FileOutputStream(args[2])));
        }
        catch(Exception exc)
        {
            exc.printStackTrace();
        }
    }

    public static void printUsage()
    {
        System.out.println("Usage: java JAXTransform <xml-source> <xsl-stylesheet> <output-location>");
    }
}

Opslaan als JAXTransform.java, compileren met javac JAXTransform.java en uitvoeren zoals in de code staat ;) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • didio
  • Registratie: Maart 2001
  • Laatst online: 01-04 09:19

didio

didio.nl

Topicstarter
Goed nieuws, het werkt..
Het zat hem in de manier hoe ASP de XML opbouwde, en door het euro teken.

Nu heb ik wel nog een bijkomend probleempie..
Ik zit hier in template van sale, dus door daar een querystring mee te geven aan de sales pagina weet de sales pagina wat te doen, omdat SubscriptionID op het zelfde niveau als Sale ga ik maar vanaf de root alle elementen weer opbouwen, dit werkt op zich wel, maar als ik meerdere sales heb zijn alle SubscriptionID's dezelfde??
code:
1
2
3
<xsl:template match="Sale[text() = 'True']">
    <a href="/sales/default.asp?id={/ADSLMC_Compare/ProviderData/SubscriptionID/text()}">bestellen</a>
</xsl:template>

weinig tot niks..


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Als je / voor een XPath expressie zet, wordt er vanaf de root van de XML file gewerkt. Het is dus niet relatief ten opzichte van je huidige knoop :) . Daarom kom je altijd op dezelfde waarde.

Ik weet je formaat niet, maar waarschijnlijk werkt het al als je de eerste / weghaald.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • didio
  • Registratie: Maart 2001
  • Laatst online: 01-04 09:19

didio

didio.nl

Topicstarter
Op maandag 19 november 2001 15:51 schreef mbravenboer het volgende:
Ik weet je formaat niet, maar waarschijnlijk werkt het al als je de eerste / weghaald.
Nee daar zat ik ook al mee te kloten.
Ik heb het zo:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<test>
  <data>
    <id>1</id>
    <sale>False</sale> 
  </data>
  <data>
    <id>2</id>
    <sale>True</sale> 
  </data>
  <data>
    <id>3</id>
    <sale>True</sale> 
  </data>
</test>


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" indent="yes" encoding="utf-8"/>
  
  <xsl:template match="test">
    <xsl:apply-templates select="data/sale"/>
  </xsl:template>

  <xsl:template match="id">
    <xsl:value-of select="."/>
  </xsl:template>

  <xsl:template match="sale[text() = 'True']">
    <a href="sales.asp?id={/test/data/id/text()}">sale</a><br/>
  </xsl:template>

  <xsl:template match="sale[text() = 'False']">
    geen sale<br/>
  </xsl:template>

</xsl:stylesheet>

Ik heb wel en oplossing gevonden, Ik heb het nu zo, dan werkt het wel, maar dat is geen mooie oplossing.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<test>
  <data>
    <sale>False
     <id>1</id>
    </sale> 
  </data>
  <data>
    <sale>True
    <id>2</id>
    </sale> 
  </data>
</test>

weinig tot niks..


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Waarom match je niet op data/sale[text() = 'False'] ? Dan kan je alles data relatief benaderen. Ook kan je trouwens .. gebruiken om 1 element omhoog te gaan. Dat zou het ook op moeten lossen :)

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • didio
  • Registratie: Maart 2001
  • Laatst online: 01-04 09:19

didio

didio.nl

Topicstarter
Op maandag 19 november 2001 16:18 schreef mbravenboer het volgende:
Waarom match je niet op data/sale[text() = 'False'] ? Dan kan je alles data relatief benaderen. Ook kan je trouwens .. gebruiken om 1 element omhoog te gaan. Dat zou het ook op moeten lossen :)
Je ben de beste wist je dat :)
Dat met .. werkt inderdaad, het werkt dus net als vroeger met DOS :)

weinig tot niks..


  • brammetje
  • Registratie: Oktober 2000
  • Laatst online: 12-01-2025
Op maandag 19 november 2001 16:38 schreef didio het volgende:
Dat met .. werkt inderdaad, het werkt dus net als vroeger met DOS :)
ja, zoiets... ;)
Pagina: 1