Avatar billede lazenby Nybegynder
11. januar 2008 - 11:36 Der er 17 kommentarer og
1 løsning

Import/include af jsp-script i xslt / jsp-tags i xslt

Hej eksperter,

Jeg er ved at udvikle et større website i JSP, hvor der på visse sider sker XSLT-transformationer af længere tekster opmærket med XML. Sitet kører på Tomcat 5.5, med xerces og xalan installeret. I de xml-opmærkede tekster skal noget fremhæves som links, som sammensættes på baggrund af attributter til elementer i xml-dokumentet, heriblandt et unikt id per link. Det fungerer helt fint.

Nu er det så blevet nødvendigt at gøre lidt mere med de links, nemlig at indsætte en længere tekst i title-attributten i disse links. Denne længere tekst kan kun hentes ud af en database ved at forespørge på førnævnte id, og da jeg ikke har adgang til id'erne før xml'en er indlæst (id'erne er gemt som attributter til hvert link), kan jeg heller ikke køre en forespørgsel fra jsp'en og sende teksten med som parameter til xslt-stylesheetet.

Problemet ville være løst, hvis jeg enten kunne bruge mine jsp-tag libraries direkte i xslt-stylesheetet, eller kunne sende en request til en ekstern jsp direkte fra xslt-stylesheetet med id'et som parameter, og få returneret resultatet som tekststreng.

Så mine spørgsmål er: Kan jeg gøre en eller begge af de to ting? Og er der nogen, der ser alternative løsninger?

Venlig hilsen,

- lazenby
Avatar billede lazenby Nybegynder
11. januar 2008 - 11:38 #1
I øvrigt, jeg kunne selvfølgelig også køre xslt-tranformationen direkte i jsp'en med jstl's x-library. Problemet er bare, at jeg har brug for nogle greb, der så vidt jeg kan se kun findes i xslt.
Avatar billede w13 Novice
11. januar 2008 - 11:41 #2
Du kan vel gemme din xslt-fil som .jsp og så bare allerøverst sætte contenttype til xslt. Mener det er sådan her:

<%@page contentType="text/xslt+xml" %>
Avatar billede w13 Novice
11. januar 2008 - 11:41 #3
Så kan du bruge jsp i filen.
Avatar billede lazenby Nybegynder
11. januar 2008 - 11:54 #4
Netop, det var jo bare det, jeg var ude efter ;) Tak for det.
Avatar billede w13 Novice
11. januar 2008 - 11:56 #5
Og tak for point! :)
Avatar billede lazenby Nybegynder
11. januar 2008 - 13:14 #6
Kunne du tilfældigvis også hjælpe mig med, hvordan man overfører variabler mellem jsp og xslt-tags? Jeg har brug for at kunne bruge resultatet af xsl:value-of i et jsp-tag for at kunne sende forespørgslen til databasen.
Avatar billede w13 Novice
11. januar 2008 - 13:16 #7
Kan den ikke bare ligge i en JSP-variable og blive indsat i xsl:value-of dynamisk, altså den anden vej rundt?
Avatar billede lazenby Nybegynder
11. januar 2008 - 13:29 #8
Jeg er ikke helt sikker på, at jeg er med. Du får det lige lidt mere konkret:

xml:
<link type="x" id="y">foobar</link>

xslt:
<xsl:template match="link">
  <a href="{@type}.jsp?id={@id}" title=""><xsl:value-of select="."/></a>
</xsl:template>

Jeg skal så have resultatet af forspørgslen 'længere tekst til ressource x' i title-attributten, og forespørgslen skal selvfølgelig sendes med et nyt id for hvert <link>, der er i xml-dokumentet. For at kunne sende den forespørgsel, skal jeg bruge resultatet af <xsl:value-of select="@id"/>, men problemet er (vel), at jsp betragter xsl-tagsene som literal results. Jeg skal altså ahve associeret det aktuelle indhold af attributten id med en jsp-variabel af en slags. Jeg er ikke sikker på, at jeg forstår hvad du mener med 'den anden vej rundt'?
Avatar billede lazenby Nybegynder
11. januar 2008 - 13:31 #9
<c:set var="id">
  <xsl:value-of select="@type"/>
</c:set>
<c:out value="${id}"/>
giver bare strengen "<xsl:value-of select="@type"/>" som resultat. Selvfølgelig.
Avatar billede lazenby Nybegynder
11. januar 2008 - 13:35 #10
(@type skulle selvfølgelig have været @id)
Avatar billede arne_v Ekspert
11. januar 2008 - 21:19 #11
Laver du transformeringen XML+XSL->HTML server side eller client side ?
Avatar billede lazenby Nybegynder
11. januar 2008 - 22:05 #12
Server side.
Avatar billede arne_v Ekspert
11. januar 2008 - 22:12 #13
Du kan kalde Java kode fra din XSLT.
Avatar billede arne_v Ekspert
13. januar 2008 - 02:05 #14
Et eksempel til inspiration:

package january;

import java.io.StringReader;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

public class Xslt2 {
    public static String getTextById(String id) {
        return "noget om " + id + " hentet fra databasen";
    }
    public static void main(String[] args) throws Exception {
        String xml = "<?xml version=\"1.0\"?>\r\n" +
                    "<links>\r\n" +
                    "<link type=\"x\" id=\"a\">foo</link>\r\n" +
                    "<link type=\"y\" id=\"b\">bar</link>\r\n" +
                    "</links>\r\n";
        String xsl = "<?xml version=\"1.0\"?>\r\n" +
                    "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\"\r\n" +
                    "                xmlns:xalan=\"http://xml.apache.org/xalan\" xmlns:help-funcs=\"xalan://january.Xslt2\" extension-element-prefixes=\"help-funcs\">\r\n" +
                    "<xsl:template match=\"/\">\r\n" +
                    "<ul>\r\n" +
                    "<xsl:apply-templates/>\r\n" +
                    "</ul>\r\n" +
                    "</xsl:template>\r\n" +
                    "<xsl:template match=\"link\">\r\n" +
                    "<li><a>\r\n" +
                    "<xsl:attribute name=\"href\"><xsl:value-of select=\"concat(@type,'.jsp?id=',@id)\"/></xsl:attribute>\r\n" +
                    "<xsl:attribute name=\"title\"><xsl:value-of select=\"help-funcs:getTextById(@id)\"/></xsl:attribute>\r\n" +
                    "<xsl:value-of select=\".\"/>\r\n" +
                    "</a></li>\r\n" +
                    "</xsl:template>\r\n" +
                    "</xsl:stylesheet>\r\n";
        System.out.print(xml);
        System.out.print(xsl);
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer t = tf.newTransformer(new StreamSource(new StringReader(xsl)));
        t.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");
        t.setOutputProperty(OutputKeys.METHOD, "html");
        t.transform(new StreamSource(new StringReader(xml)), new StreamResult(System.out));
    }
}
Avatar billede lazenby Nybegynder
14. januar 2008 - 19:03 #15
Hej arne_v - tak for inspiration. Problemet er dog ikke så meget at køre javakode i stylesheetet; det problem gav w13 løsningen på i svaret. Mit problem nu er, at jeg skal bruge outputtet fra xslt til en databaseforespørgsel - men der er så vidt jeg kan skønne ingen oplagt måde at gøre dét på, da jsp'en jo strengt taget bare skriver en xml-fil ud, hvorefter selve xslt-transformationen så foregår efterfølgende. I guess?
Avatar billede arne_v Ekspert
30. marts 2008 - 21:06 #16
Øh.

<%@page contentType="text/xslt+xml" %>

bruges til at sende XSL til browser så man kan transformere client side.

Hvis du transformerer server side kan du tage output og bruge i din database
forespørgsel.

Bare transformer til en StringWriter.
Avatar billede lazenby Nybegynder
30. marts 2008 - 21:16 #17
Øh. Tak for det. Først nu kan jeg se, hvad du mener. Det anede jeg ikke, at man kunne.

Pointene skulle have været dine, beklager!
Avatar billede arne_v Ekspert
30. marts 2008 - 21:24 #18
Skidt pyt. Jeg faldt bare over dette gamle spørgsmål i.f.m. lidt mail oprydning.
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