Avatar billede kapoou Nybegynder
21. marts 2009 - 14:01 Der er 24 kommentarer og
1 løsning

Kalde klasse fra XSLT

Hvis jeg har lavet en klasse i app_code kataloget hvordan kan jeg så kalde denne klasse fra XSLT templaten? Hvis man da overhovedet kan det.
Avatar billede arne_v Ekspert
21. marts 2009 - 14:48 #1
De fleste XSLT procesorer tillader callout til et programmerings sprog, så processer du XSLT client side kan du kalde JavaScript - og er det server side kan du kalde Java eller .NET hvis du bruger disse.
Avatar billede kapoou Nybegynder
21. marts 2009 - 18:00 #2
Hvis jeg har følgende kode

    XslTransform xslt = new XslTransform();
    xslt.Load(stylesheet);

    XPathDocument doc = new XPathDocument(filename);

    XsltArgumentList xslArg = new XsltArgumentList();
       
    Calculate obj = new Calculate();
    xslArg.AddExtensionObject("urn:myObj", obj);

    XmlTextWriter writer = new XmlTextWriter(Console.Out);

    xslt.Transform(doc, xslArg, writer);

i codebehind filen. Hvordan får jeg så outputtet ud på aspx siden?
Avatar billede arne_v Ekspert
21. marts 2009 - 18:45 #3
XmlTextWriter writer = new XmlTextWriter(Console.Out);

->

XmlTextWriter writer = new XmlTextWriter(Response.Output);
Avatar billede kapoou Nybegynder
21. marts 2009 - 23:11 #4
Det virker jo helt perfekt. Jeg kalder en klasse der hedder Calculate (den hedder så nu Modules) og i den klasse ønsker jeg igen at køre noget xslt, men der får jeg så følgende fejl.

Cannot access a non-static member of outer type 'System.Web.UI.Page' via nested type 'Demo_page2.Modules'

Hvordan skal jeg strukturere det for at få det til at fungere?
Avatar billede kapoou Nybegynder
21. marts 2009 - 23:20 #5
Nå, nu er det såikke den fejl jeg får længere. Jeg lagde Klassen Modules uden for demo_page2 klassen og det hjalp. Nu får jeg så denne fejl

XmlTextWriter writer = new XmlTextWriter(Response.Output);
Avatar billede kapoou Nybegynder
21. marts 2009 - 23:21 #6
Her kommer fejlen

The name 'Response' does not exist in the current context
Avatar billede arne_v Ekspert
21. marts 2009 - 23:38 #7
Prøv med:

HttpContext.Current.Response.Output
Avatar billede kapoou Nybegynder
21. marts 2009 - 23:42 #8
Det virkede! Super, tak!

Et sidste spørgsmål. Fra xslt templaten kalder jeg nogle funktioner inde i klassen Modules og de laver en return. Problemet er dog at når denne return indeholder noget html så bliver det ikke fortolket men bare skrevet direkte ud. Hvordan kan jeg undgå dette?
Avatar billede arne_v Ekspert
21. marts 2009 - 23:51 #9
Det kan jeg ikke sige.

Du bliver nødt til at lave view source i browseren og kigge på det og se hvad der går galt.
Avatar billede kapoou Nybegynder
21. marts 2009 - 23:53 #10
Den laver < og > om til &lt; osv.
Avatar billede arne_v Ekspert
22. marts 2009 - 00:21 #11
Er du sikker på at det ikke er din XSLT som får escapet de HTML tags ?
Avatar billede arne_v Ekspert
22. marts 2009 - 00:22 #12
Men efter at have tænkt lidt over det, så tror jeg faktisk at det er bedre at sende en StringWriter og så assigne output fra den over i en Literal kontrol.
Avatar billede kapoou Nybegynder
22. marts 2009 - 00:45 #13
Sådan som det fungere lige nu er at min xslt fil indeholder f.eks. følgende

<xsl:value-of select="myObj:getHeading($pageid)"/>

Funktionen getHeading laver så en return med det den har trukket ud af databasen.

Hvis man skulle gøre det som du nævner hvordan ville det så se ud?
Avatar billede arne_v Ekspert
22. marts 2009 - 00:54 #14
StringWriter sw = new StringWriter();
XmlTextWriter writer = new XmlTextWriter(sw);
lit.Text = sw.ToString();

hvor:

<asp:Literal id="lit" runat="server"/>
Avatar billede kapoou Nybegynder
22. marts 2009 - 01:00 #15
Ok, men det hele kører jo via xslt templaten og der kan jeg jo ikke smide <asp:Literal id="lit" runat="server"/> ind. Du må undskylde hvis jeg er lidt blank på det, men jeg er ikke så velbevandret i xslt verdenen.
Avatar billede arne_v Ekspert
22. marts 2009 - 01:01 #16
Hvis XSLT skal generere den komplette HTML så behøver du ikke literal.

Så skal du bare af med den HTML escape.

Hvordan ser toppen af din XSLT ud ?
Avatar billede kapoou Nybegynder
22. marts 2009 - 01:04 #17
Ok.

Dette er toppen.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:myObj="urn:myObj">
    <xsl:output method="html"/>
    <xsl:param name="pageid"/>
    <xsl:template match="data">
Avatar billede arne_v Ekspert
22. marts 2009 - 01:19 #18
Jeg forstår ikke hvor den HTML escaping kommer fra.

Er det de tags som returneres fra getHeading og andre metode der bliver escapet mens faste tags i XSL'en ikke bliver escapet ?
Avatar billede kapoou Nybegynder
22. marts 2009 - 01:21 #19
Ja det er kun de der bliver returneret fra funktionerne. Tags i xsl templaten ser helt fine ud. Jeg har lige prøver at sætte en replace på strengen der bliver returneret og det hjælper ikke engang, så det kunne tyde på at det er xsl templaten der gør det.
Avatar billede arne_v Ekspert
22. marts 2009 - 01:35 #20
Arg.

Det er jo ikke meningen at man skal bruge XSLT på den måde.

Houston we have a problem.
Avatar billede arne_v Ekspert
22. marts 2009 - 01:42 #21
Prøv med:

<xsl:value-of select="myObj:getHeading($pageid)" disable-output-escaping="yes"/>
Avatar billede arne_v Ekspert
22. marts 2009 - 01:42 #22
Men det er ikke pænt.
Avatar billede kapoou Nybegynder
22. marts 2009 - 20:26 #23
Det har jeg prøver men det gjorde desværre ingen forskel.

Smid et svar så du kan få dine velfortjente points!

Og mange tak for din hjælp.
Avatar billede arne_v Ekspert
22. marts 2009 - 20:33 #24
ok
Avatar billede kapoou Nybegynder
26. marts 2009 - 20:42 #25
-> arne_v. Hvis jeg lige kan snige et ekstra spørgsmål ind, kan du så fortælle mig hvordan jeg i steder for at outputte indholdet med denne kommando

HtmlTextWriter writer = new HtmlTextWriter(Response.Output);

så bare gemmer det i en variable som jeg kan brugere videre.
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