Avatar billede dgivoni Nybegynder
14. februar 2002 - 14:52 Der er 7 kommentarer og
2 løsninger

baglæns udskrivning af 'nodes'

Jeg har et XML-dokument, hvis indhold ser således ud:

<parentPage url="forum.asp">
Forum
  <parentPage url="forside.asp">
  Forside
  </parentPage>
</parentPage>

Der er ingen grænse for hvor mange parentPages der kan være. Det jeg ønsker er at løbe disse parentpages igennem og konstruere et HTML-resultat som ser således ud:
<a href="forside.asp">forside</a> <a href="forum.asp>forum</a> ...

Min umiddelbare idé er at lave et rekursivt gennemløb til bunden og derefter indholdet i omvendt rækkefølge. Men hvordan gør man det i xslt?
Avatar billede dgivoni Nybegynder
14. februar 2002 - 14:53 #1
andensidste sætning skulle være: ... og derefter RETURNERE indholdet ....
Avatar billede kennethrisum Nybegynder
14. februar 2002 - 14:57 #2
Jeg tror du er nødt til at bruge JavaScript til det. Jeg mener ikke XSL sproget giver mulighed for baglæns travesering.
Avatar billede altinet Nybegynder
14. februar 2002 - 16:13 #3
Avatar billede ehf Nybegynder
14. februar 2002 - 20:21 #4
Følgende xlst skulle give en liste inde fra og ud.

XML
<parentPage url="A.asp">A
    <parentPage url="B.asp">B
        <parentPage url="forum.asp">Forum
              <parentPage url="forside.asp">Forside</parentPage>
        </parentPage>
    </parentPage>
</parentPage>

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

    <!-- Match parentPage -->
    <xsl:template match="parentPage">
        <xsl:if test="string-length(descendant::parentPage[1]) = 0">
            <!-- This is the deepest node -->
            <xsl:call-template name="WriteYoung" />
        </xsl:if>
        <xsl:apply-templates/>
    </xsl:template>
    <xsl:template match="text()"/>

    <xsl:template name="WriteYoung">
        <!-- Writes a href and calls recursively for its own parent -->
        <a href="{@url}"><xsl:value-of select="normalize-space(text())"/></a>
        <br/>
        <xsl:for-each select="parent::parentPage">
            <xsl:call-template name="WriteYoung" />
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

RESULTAT
<a href="forside.asp">Forside</a><br><a href="forum.asp">Forum</a><br><a href="B.asp">B</a><br><a href="A.asp">A</a><br>

Jeg håber det kan hjælpe.
/ehf
Avatar billede janegil Nybegynder
14. februar 2002 - 20:45 #5
Og jeg tror koden kan skrives uten ekspisitt testing av hvor dypt i rekursjonen du er kommet.

Du skal bare starte din template med <apply-templates/>, FØR du produserer teksten som er basert på current node. Så vil rekursjonen først bore seg til bunns i strukturen uten å produsere output, og så produsere output i den rekkefølgen du vil ha den, på veien opp igjen.
Avatar billede janegil Nybegynder
14. februar 2002 - 21:30 #6
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="parentPage">
        <xsl:apply-templates select="parentPage"/>
        <a>
            <xsl:attribute name="href">
                <xsl:value-of select="@url"/>
            </xsl:attribute>
            <xsl:value-of select="text()"/>
        </a>
        .
    </xsl:template>
   
    <xsl:template match="/">
        <html xmlns="http://www.w3.org/1999/xhtml">
            <head><title>Baklengs</title>    </head>
            <body>
                <p>
                    <xsl:apply-templates/>
                </p>
            </body>
        </html>
    </xsl:template>
   
</xsl:stylesheet>
Avatar billede ehf Nybegynder
15. februar 2002 - 07:49 #7
Hvis nogen skal have point, er det janegil.

Det er en elegant løsning.

/ehf
Avatar billede janegil Nybegynder
15. februar 2002 - 09:23 #8
I all ubskjedenhet: ja. Men takk til deg også, jeg var ikke klar over
<a href="{@url}">
som både er kortere og mere forståelig enn
  <a>
  <xsl:attribute name="href">
                <xsl:value-of select="@url"/>
            </xsl:attribute>
            <xsl:value-of select="text()"/>
        </a>
Avatar billede dgivoni Nybegynder
25. februar 2002 - 14:57 #9
mange tak for svarene, jeg har ligget med influenza, derfor den sene point-tildeling
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