XSL probleem

Pagina: 1
Acties:

  • party42
  • Registratie: Oktober 2000
  • Laatst online: 12:47
Dag mede tweakers / got'ers...

Volgende XSL probleem dient zich aan. Ik wil mezelf de moeite besparen om voor elke rij in een tabel alle tags opnieuw te maken, hiervoor heb ik een simpel javascriptje geschreven. Echter, xml gaat hier niet echt lekker mee om. In ieder geval hieronder 2 voorbeelden en de output. In het eerste geval tovert XSL de tags dus daadwerkelijk als strings op het scherm. In het 2e geval

voorbeeld 1:
code:
1
2
3
4
5
6
7
8
9
<xsl:script language="Javascript">
<![CDATA[
    function PrintRow(omschrijving, waarde) 
    {

           var werktniet = ("<tr><td>"+omschrijving+"</td><td>"+waarde+"</td></tr>");
           return (werktniet);
       }
]]></xsl:script>

output:
code:
1
<tr><td>Geboortedatum</td><td>Pietje</td></tr>

Voorbeeld 2
code:
1
2
3
4
5
6
7
8
<xsl:script language="Javascript">
<![CDATA[
function PrintRow(omschrijving, waarde) 
    {
           
           var werktniet = ("&lt;tr&gt; &lt;td&gt;"+omschrijving+"&lt;/td&gt; &lt;td&gt;"+waarde+"&lt;/td&gt;&lt;/tr&gt;");
           return (werktniet);
]]></xsl:script>

Met als output
code:
1
&lt;tr&gt; &lt;td&gt;Geboortedatum&lt;/td&gt; &lt;td&gt;Pietje&lt;/td&gt;&lt;/tr&gt;

Heeft iemand advies? Ik wil dus gewoon dat de tags opgepakt worden door HTML.... In plaats van ze als strings weer te geven.

Everyday's an endless stream, of cigarettes and magazines...


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Waarom gebruik je niet gewoon een named template? Dit doet volgens mij precies wat jij wilt. Je kan een template maken met een naam en een aantal parameters (zonder match dus). Daarna kan je deze template aanroepen.

Voorbeeldje:
code:
1
2
3
4
5
6
7
8
9
10
<xsl:template name="displayEmotion">
   <xsl:param name="ref"/>
  [img]"{$EmotionDocument/emotions/emotion[@id=$ref]/@image}"[/img]
</xsl:template>

<xsl:template match="pml:smile|pml:devil|pml:confused|pml:wink">
   <xsl:call-template name="displayEmotion">
    <xsl:with-param name="ref" select="name(.)"/>
   </xsl:call-template>
</xsl:template>

In de tutorial op http://www.xfront.com staat het nog verder uitgelegd.

Als je toch Javascript wilt blijven gebruiken zal je gebruik moeten maken van het disablen van de escaping. Dit kan in xsl:value-of met attribuut "disable-output-escaping".

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


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Overigens moet je dit natuurlijk alleen gebruiken als je op verschillende locaties met verschillende templates dezelfde constructie wilt gebruiken. Zolang je het met een generieke template kan doen, is dat nog veel mooier.

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


  • party42
  • Registratie: Oktober 2000
  • Laatst online: 12:47
Dat met dat disable output processing werkt nog niet echt. Misschien kun je even contact opnemen via ICQ (ja, ik heb je al gepaged...) :) want dat praat wat makkelijker!

Everyday's an endless stream, of cigarettes and magazines...


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Ik kom maar af en toe even online ivm inbel verbinding :( . Als je nog vragen hebt kan je ze beter maar hier stellen. Kijk ook eens goed naar de tutorial op http:/www.xfront.com . Daar staat het namelijk precies in :) .

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


  • party42
  • Registratie: Oktober 2000
  • Laatst online: 12:47
Klopt ja, maar ik probeer in eerste instantie nog even vast te houden aan de javascript oplossing.

Volgende situatie is nu ontstaan:
code:
1
2
3
4
5
6
7
8
9
10
11
<script type="text/JScript">

    function PrintRow(omschrijving,xmlwaarde)
        {
        XML = "xsl:value-of select="
        XML2 = xmlwaarde
        XML3 = XML + XML2
        Naw = "<tr><td>" +omschrijving+ "</td><td>&lt;" + XML3 + "/&gt;</td></tr>"
        document.write(Naw);
        }
</script>

heeft als output:
code:
1
Geboortedatum <xsl:value-of select=@gebdatum/>

Da's mooi behalve dat ik er niets aan heb. Doe ik het zo:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<script type="text/JScript">

    function PrintRow(omschrijving,xmlwaarde)
        {
        XML = "xsl:value-of select="
        document.write(XML);
        XML2 = xmlwaarde
        document.write(XML2);
        XML3 = XML + XML2
        document.write(XML3);
        Naw = "<tr><td>" +omschrijving+ "</td><td><" + XML3 + "/>;</td></tr>"
        document.write(Naw);
        }
</script>

Dan krijg ik de volgende XSL foutmelding:
code:
1
2
3
4
5
6
A name was started with an invalid character. 
Error processing resource 

Naw = "<tr><td>" +omschrijving+ "</td><td><" + XML3 
+ "/>;</td></tr>"
------------------------------------------^

Met andere woorden. Ik mag niet zomaar een tag haakje openen, er vervolgens een string inzetten en weer afsluiten. Oplossing????

Everyday's an endless stream, of cigarettes and magazines...


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Als je geen CDATA section eromheen zet moet je XML document well-formed zijn. Dat is het niet en dus klaagt hij...

Ik begrijp niet waarom je deze minder mooie script constructie gebruikt als er een goede standaard oplossing voor is: named template met een parameter... Waarom wil je de script oplossing blijven gebruiken?

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


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Ik zet net trouwens in m'n XSLT reference te kijken of die script oplossing wel correct is. Ik gebruik hem nooit, dus wist niet zeker of dit wel in de standaard zit.

Niet dus. Volgens mijn reference kent de XSLT standaard geen script tag (heb nog niet in de W3C docs gekeken).

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

Pagina: 1