Avatar billede davidchristensen Praktikant
21. februar 2003 - 23:23 Der er 11 kommentarer og
1 løsning

xsl:include der samtidigt inkluderer en relevant xml-fil?

Hej her.

Jeg har med a littele help from my friends her på eksperten fundet ud af hvordan jeg includer en xsl-template i et andet stylesheet. Fungerer fint, sådan da.. fordi de xml-data det inkluderede stylesheet skal formatere er ikke længere med da det stylesheet som jeg includer ind i har en anden xml-source end min inkluderede template.. Jeg har så brug for en måde hvorpå man kan includere en xsl-template OG et xml-dokument (altså på samme tid) som indeholder data der er relevante for den givne template. Og så klør jeg mig i nakken og kan ik lige hitte ud af det..

Kan nogen hjælpe? :)

David
-
Avatar billede Slettet bruger
22. februar 2003 - 00:33 #1
Sæt f.eks. en variabel i dit inkluderede stylesheet:

<xsl:variable name="userData" select="document('../users.xml')/users" />
...
<xsl:template match="UserLink">
  <xsl:apply-templates select="$userData//user[@id = current()/@ref]" />
</xsl:template>

Hvis "users.xml" indeholder de trivielle data (såsom højde og lyssværd-skills), kunne flg. XML doc. gøre brug heraf:

<CoolGuys>
  <UserData ref="elvis.p" />
  <UserData ref="yoda.jedi" />
</CoolGuys>

osv.

/CS
Avatar billede Slettet bruger
22. februar 2003 - 00:35 #2
Ups - templaten skal selvfølgelig match'e "UserData" istedet for "UserLink" :-)

/CS
Avatar billede davidchristensen Praktikant
22. februar 2003 - 15:55 #3
Det vil ik lige virke.. Måske ligger hemmeligheden i <xsl:apply-templates select="$userData//user[@id = current()/@ref]" /> som jeg ik lige helt kan gennemskue hvordan fungere..

Ihvertfald, mit forsøg her går ud på at include en xsl-template som vil fungere som en navigationsmenu.

XML-dokumentet ser sådan ud:

<navigationsmodul>   
    <menupunkt>
        <tekst>Forside</tekst>
        <link>../pages/page_frontpage.xml</link>
        <target>iframe_1</target>
    </menupunkt>
    <menupunkt>
        <tekst>Index alle sider</tekst>
        <link>../pages/page_index_allpages.xml</link>
        <target>iframe_1</target>
    </menupunkt>
</navigationsmodul>

og det includede xsl-dokument ser nu sådan ud:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="html"/>
   
    <xsl:variable name="navigationsmodul" select="document('module_navigation.xml')/navigationsmodul/menupunkt" />

    <xsl:template match="/">
        <html>
           
            <body bgcolor="red">
       
       

                <table width="100%" border="1">
                    <tr>
                              <td><b>TestSite</b></td>
                    </tr>
                        <tr>
                              <td>
                           
                            <table border="1" align="right">
                                <tr>
                                    <xsl:apply-templates select="navigationsmodul"/>
                                </tr>
                            </table>
                        </td>
                    </tr>
                  </table>

            </body>
        </html>
    </xsl:template>

    <xsl:template match="navigationsmodul">
       
            <td>
                <a>
                    <xsl:attribute name="href">
                        <xsl:value-of select="link"/>
                    </xsl:attribute>
                    <xsl:attribute name="target">
                        <xsl:value-of select="target"/>
                    </xsl:attribute>
                   
                   
                    <xsl:value-of select="tekst"/>
   
                </a>
            </td>
       
    </xsl:template>



</xsl:stylesheet>


..men det virker bare ik helt.. En del af filen blir vist (den del der er uafhængig af xml-dokumentet) men selve menuknapperne er der ik..

Kan du lige lure hvad det er der er forkert.?

David
-
Avatar billede davidchristensen Praktikant
22. februar 2003 - 16:38 #4
..iøvrigt, det xsl-dokument som 'navigationsmodul' includes I ser sådan ud, hvis du kan bruge det til noget..:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="html"/>
   
    <xsl:include href="modules/module_navigation.xsl" />
   

    <xsl:template match="/">
        <html>
            <head>
                <title>
                    <xsl:value-of select="site/generel_information/navn"/>
                </title>
            </head>
           
            <body>
                <table width="100%" height="100%" border="1" align="center">
                      <tr>
                        <table width="100%" border="1" bgcolor="red">
                            <tr>
                                      <td><b>TestSite</b></td>
                            </tr>
                                <tr>
                                <td>
                                    <table border="1" align="right">
                                        <tr>
                                            <xsl:apply-templates select="modules/navigationsmodul"/>
                                        </tr>
                                    </table>
                                </td>
                            </tr>
                          </table>
                    </tr>
                   
                    <tr>
                            <td>
                                <iframe width="100%" height="90%" name="iframe_1" src="pages/page_frontpage.xml"></iframe>
                        </td>
                      </tr>
                    <tr>
                            <td height="32">Test BundModul<b>V</b>
                               
                        </td>
                      </tr>
                </table>
            </body>
        </html>
    </xsl:template>
                           
</xsl:stylesheet>
Avatar billede davidchristensen Praktikant
22. februar 2003 - 18:29 #5
Nu har jeg set noget jeg havde glemt og har lavet lidt om, men det virker stadig ik.. :/

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="html"/>
   
    <xsl:variable name="navigationsmodul" select="document('module_navigation.xml')/navigationsmodul/menupunkt"/>


    <xsl:template match="/">
        <html>
           
            <body bgcolor="red">
       
       

                <table width="100%" border="1">
                    <tr>
                              <td><b>TestSite</b></td>
                    </tr>
                        <tr>
                              <td>
                           
                            <table border="1" align="right">
                                <tr>
                                    <xsl:apply-templates select="navigationsmodul"/>
                                </tr>
                            </table>
                        </td>
                    </tr>
                  </table>

            </body>
        </html>
    </xsl:template>

    <xsl:template match="navigationsmodul">
        <td>
            <a>
                <xsl:attribute name="href">
                    <xsl:value-of select="$navigationsmodul//link"/>
                </xsl:attribute>
                <xsl:attribute name="target">
                    <xsl:value-of select="$navigationsmodul//target"/>
                </xsl:attribute>
               
               
                <xsl:value-of select="$navigationsmodul//tekst"/>
            </a>
        </td>
    </xsl:template>

   


</xsl:stylesheet>
Avatar billede Slettet bruger
23. februar 2003 - 00:02 #6
Når du definerer variablen sådan:

<xsl:variable name="navigationsmodul" select="document('module_navigation.xml')/navigationsmodul/menupunkt"/>

- Så ender den med kun at indeholde det første <menupunkt> element - lad den pege på <navigationsmodul> elementet, og apply dettes children, altså:

<xsl:variable name="navigationsmodul" select="document('module_navigation.xml')/navigationsmodul"/>

...

<xsl:apply-templates select="$navigationsmodul/menupunkt" />

/CS
Avatar billede davidchristensen Praktikant
23. februar 2003 - 17:48 #7
Nu er jeg forvirret i min logik for xml..

hvis man siger <xsl:apply-templates select="$navigationsmodul/menupunkt" />, så må templaten den applyer jo hedde <xsl:template match="$navigationsmodul/menupunkt">, men så skriver browseren: "Der m&#20512;ikke bruges variabler i dette udtryk. -->$navigationsmodul<--/menupunkt" Den laver os' lidt kinesiske tegn eller hvad det nu er..
Avatar billede Slettet bruger
23. februar 2003 - 22:16 #8
Nej - der har du misforstået noget: I select attributten på "apply-templates" angiver du stien i XML dokumentet til den eller de templates du vil aktivere - i match attributten på "template" fortæller du hvilke elementer der skal transformeres vha. denne template.

Variabler kan bruges som argument i "select", men ikke i "match".

Din template skal bare matche "menupunkt" - så ved XSLT processoren hvad den skal gøre med <menupunkt/> elementer - og i apply-templates fortæller du at du gerne vil aktivere templates for alle <menupunkt/> elementer der findes i variablen "$navigationsmodul" (husk den peger på <navigationsmodul/> der indeholder flere <menupunkt/>)...

Håber det hjalp lidt.

/CS
Avatar billede davidchristensen Praktikant
24. februar 2003 - 01:35 #9
Greystate, her kan du se hvordan jeg prøver detder du fortalte mig om variablen, og jeg applyer en tempplate, men jeg er meget i tvivl om hvordan jeg formulere selve templaten så den matcher dataene fra variablen.. Hvordan ville di gøre med dether stylesheet som udgangspunkt? (Husk, at stylesheetet bliver includet i et andet stylesheet med xsl:include..)

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="html"/>

    <xsl:variable name="navigationsmodul" select="document('module_navigation.xml')/navigationsmodul"/>
   
   
    <xsl:template match="/">
    <html>
        <body bgcolor="red">
        <table border="1" align="right">
            <tr>
                      <xsl:apply-templates select="$navigationsmodul/menupunkt"/>
            </tr>
        </table>
        </body>
    </html>
    </xsl:template>

    <xsl:template match="/menupunkt">
        <td>
            <a>
                <xsl:attribute name="/href">
                    <xsl:value-of select="/link"/>
                </xsl:attribute>
                <xsl:attribute name="target">
                    <xsl:value-of select="/target"/>
                </xsl:attribute>
               
                <xsl:value-of select="/tekst"/>
            </a>
        </td>
    </xsl:template>

</stylesheet>
Avatar billede Slettet bruger
24. februar 2003 - 09:35 #10
Problemet er nu at stien i din match siger: "Denne template gælder for rodelementer der hedder 'menupunkt'." - En forwardslash bruges (ligesom i en URL) til at vise at denne sti starter i roden.

Hvis du fjerner slashen bør det virke som du gerne vil...

/CS
Avatar billede davidchristensen Praktikant
24. februar 2003 - 17:46 #11
Det virker fint uden den skråstreg hvis jeg åbner module_navigation.xml i browseren. Men når module_navigation.xsl includes i framset.xsl, så vil det ik..

Jeg includer filen med <xsl:include href="modules/module_navigation.xsl" />, men hvordan kalder jeg så tempplaten "menupunkt" i dette stylesheet? fordi det dur ik hvis jeg bare skriver <xsl:apply-templates select="menupunkt" />.. Nu er princippet her jeg er efter så tæt på.. :)

David
-
Avatar billede davidchristensen Praktikant
24. februar 2003 - 18:05 #12
nå, nu virker det. sku bare kalde $navigationsmodul/menupunkt :) er lidt forvirret, men okay.. *s* Tusind tak. Lur mig om jeg ik snart stiller et spørgsmål om variabler.. ;)
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