Avatar billede dj_uncas Nybegynder
28. november 2006 - 12:34 Der er 13 kommentarer og
1 løsning

XmlTextWriter og XslCompiledTransform

Hejsa

Jeg har fået mig et problem, som jeg har svært ved at se en fed løsning på:

Jeg har en abstract metode i en klasse

void WriteXml(XmlTextWriter writer)

som skal implementeres i nedarvede klasser og proppe den rigtige XML ind i writeren.
Problemet er at jeg skal bruge XslCompiledTransform til at transformere den indkomne XML, og den kan på ingen måde lide en writer, hvilket vil sige at jeg på en eller anden måde skal have fat i en reader.. Hvordan gør jeg det på den pæne måde?

Det hele skal bruges med HtmlTextWriter output stream, så jeg kan  (vil) ikke gemme i midlertidige filer...
Avatar billede snepnet Nybegynder
28. november 2006 - 18:13 #1
Der er da overloads på Transform der tager en writer som parameter ... ?
(Der er også overloads der tager en stream, hvis du alligevel skal have det ud i en outputstream ... ).
Kan du vise et fuldt kodeeksempel på det du gerne vil?
Mvh
Avatar billede dj_uncas Nybegynder
28. november 2006 - 19:58 #2
Der er kun overloads der tager en writer som *output* parameter. Min writer skal være input...

Jeg har en abstrakt metode med følgende signatur:

public abstract void WriteXml( XmlWriter writer );

Derudover overskriver jeg Render (det er en WebControl):

protected override void Render(HtmlTextWriter writer)
{
    //Her vil jeg så gerne lave noget i denne stil:

    StringBuilder sb = new StringBuilder();
    XmlWriter xmlWriter = new XmlTextWriter( sb );
    WriteXml( xmlWriter );

    XmlWriter output = new XmlTextWriter( writer );

    XslCompiledTransform xsl = new XslCompiledTransform();
    xsl.Load( "filen.xsl" );

    xsl.Transform( xmlWriter, output ); // Det er her den knækker... Jeg er åbenbart nød til at lave min writer om til en reader...

    base.Render( writer );
}
Avatar billede snepnet Nybegynder
28. november 2006 - 22:49 #3
Ikke forstået ... Du kan da ikke komme med to writers.

Du transformerer det du får via en reader til en given writer ... Hvordan skulle det give mening at kalde med to writers (svarer til at du transformere det du skriver, til det du skriver)?

Hvad skal resultatet af den kode du skriver være (hvad er det du vil opnå)?

Mvh
Avatar billede dj_uncas Nybegynder
28. november 2006 - 23:26 #4
Helt basalt er målet at jeg kan lave webcontrols som bruger min WriteXml metode til at skrive noget XML ud der giver mening for den kontrol. Den skal desuden have et XSLT dokument tilknyttet som min base-webcontrol bruger til at transformere XML output om til noget fornuftigt HTML...

Jeg er derfor, sådan som jeg ser det, tvunget til at hive fat i to writere da den ene har til opgave at få XML skrevet til sig, mens den anden skal være html outputtet, som i ASP.NET repræsenteres af en HtmlTextWriter...
Avatar billede snepnet Nybegynder
29. november 2006 - 00:41 #5
Mmmm .... Der findes en kontrol der kan transformere xml med xsl(t) i forvejen (system.web.ui.webcontrols.xml) - er det bare det du vil?.
Jeg forstår ikke helt din skitse.
Er det hensigten at kontrollen skal udskrive noget xml (der transformeres) vha. metoden WriteXml, og efterfølgende rendere sig selv som vanligt (så får du jo ikke huset det du får ud af xml'en i selve kontrollen.
Du kan jo arbejde med alle de readers og writers du gider i din kode, men du kan ikke transformere fra en writer til en writer.
Mvh
Avatar billede dj_uncas Nybegynder
29. november 2006 - 09:38 #6
Mit scenarie er at min "XmlWebControl" er abstrakt, og at andre kontroller nedarver fra den og kun skriver noget XML ud, som den abstrakte klasse så sørger for at transformere i forhold til det valgte XSLT dok. Hensigten er at undgå at hardkode for meget html m. HtmlTextWriter, da jeg synes det er noget rod at skrive html i den kompilerede kode. Jeg vil gerne abstrahere selve html layoutet ud i noget XSL, og jeg så denne mulighed som  fornuftig.

Et eksempel (XmlLabel):

public void WriteXml(XmlWriter writer)
{
    writer.WriteStartElement( "label" );
    writer.WriteString( "test string" );
    writer.WriteEndElement();
}


^ dette giver mig <label>test string</label> som XML output.. Herefter vil jeg så bruge et XSL dok. til at transformere det til eks. <span>test string</span>

Jeg fik en proof-of-concept op at køre i går, men jeg er ikke sikker på hvor fedt det er implementeret. Vil du lige kigge på det?

http://blizan.com/XmlWebControl.cs

Det spændende sker i override af metoden RenderContents...
Avatar billede snepnet Nybegynder
29. november 2006 - 10:29 #7
Hvorfor skulle du skrive html i din kode?
... Prøv at give mig et eksempel på en kontrol du vil lave på den måde (altså et komplet eksempel med noget xsl etc.
Mvh
Avatar billede dj_uncas Nybegynder
29. november 2006 - 11:11 #8
Normalt når man laver en WebControl vil man overskrive Render metoden, for at få den til at skrive det ud du vil have, eks:

protected override void Render( HtmlTextWriter writer )
{
    writer.AddAttribute( HtmlTextWriterAttribute.Class, "sjovtspan" );
    writer.RenderBeginTag( HtmlTextWriterTag.Span );
    writer.Write( "test string" );
    writer.RenderEndTag();
}

Jeg vil bare gerne undgå at skrive den slags i kompileret kode. Hvis jeg en dag vil vælge at bruge div'er i stedet for spans til labels, vil jeg gerne kunne nøjes med at ændre i en XSL fil og ikke skulle kompilere en ny version..

Eks. på XSL:

<xsl:template match="/">
    <xsl:for-each select="label">
        <span class="sjovtspan">test string</span>
    </xsl:for-each>
<xsl:template>


Selve den kontrol der skal generere XML skal i princippet ikke gøre meget mere end at implementere WriteXml metoden, og så have den funktionalitet kontrollen  nu skal have, på samme måde som med alm. kontroller.
Avatar billede snepnet Nybegynder
29. november 2006 - 12:00 #9
Der er ingen der tvinger dig til at skrive dine kontroller på den måde - du kan lave composite controls, hvor du alene indsætter alm. asp.net kontroller, og ikke fedter rundt med renderingen:

public class SomeControl : Control
{
    protected override void CreateChildControls()
    {
        Controls.Add(new TextBox());
        Controls.Add(new Button());
        base.CreateChildControls();
    }
}

Men du beslutter dig selvfølgelig der hvad der renderes fra din kontrol.

Du kan jo bruge usercontrols, hvis du ønsker at have en deklerativ mulighed for at pille ved hvordan den ser ud.

Med den model du har valgt der - synes jeg der er nogle ting du skal overveje ... F.eks.
Hvad hvis du ønsker at sætte en knap ind på kontrollen, og abbonnere på hændelsen at der klikkes på den, og implementere noget funktionalitet der.

Hvad når du indsætter dine kontroller på sider ... De skal jo udstille et api der giver mening for kontrollen (properties, metoder, events osv.). Det kan du jo ikke på nogen måde opnår når du bygger kontrollen på den måde.

Desuden er der jo kontroller der renderes forskelligt afhængigt af browseren, hvilket du så også risikerer at spolere på den måde.

Det er muligt jeg misforstår dig ... Jeg kunne rigtig godt tænke mig at se et kørende eksempel på det du ønsker at lave.
Hvis du kan lave sådan en jeg kan downloade et sted, og kigge lidt på vil jeg meget gerne give dig en hånd.
Den slags kan godt lade sig gøre, men hvis jeg forstår dig ret - så har du temmelig langt til mål, hvis du skal opnå en god genbrugelig generisk kontrol - der også giver dig nogle muligher på siderne.

Du er meget velkommmen til at skrive til mig på messenger omkring det også.
(du kan smide din messengerkonto her, så skal jeg nok tilføje dig ... Der er noget andet jeg også gerne vil snakke med dig om).

Mvh
Avatar billede dj_uncas Nybegynder
29. november 2006 - 12:29 #10
Okay, så lad os tage den videre på messenger:
dj_uncas snabela aoa punktum dk
Avatar billede snepnet Nybegynder
30. november 2006 - 21:17 #11
Har du ikke fået en invitation fra mig?
Mvh
Avatar billede dj_uncas Nybegynder
01. december 2006 - 00:41 #12
Jo, og jeg har vist også accepteret den, men jeg har ikke lige haft tid til at gå videre.. har du evt. tid i weekenden?
Avatar billede snepnet Nybegynder
01. december 2006 - 07:31 #13
Du kan bare skrive når det passer dig ... Jeg skal nok sige til hvis det er et dårligt tidspunkt.
Mvh
Avatar billede dj_uncas Nybegynder
10. januar 2007 - 14:13 #14
Jeg lukker her... Jeg tror jeg lader sagen ligge indtil videre - der er masser andet at lave ;-)
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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



Seneste spørgsmål Seneste aktivitet
I dag 10:28 PDFEngine Af barth i Andet software
I går 22:40 Butte indhold i celler Af lurup i Excel
I går 15:24 Power Query Af djsimonsen i Excel
I går 14:43 Hvis ikke på liste, tilføj værdier til liste Af TheLibrarian i Excel
I går 11:33 Windows 11 Af ranni i Windows