Avatar billede odie Nybegynder
24. maj 2006 - 08:55 Der er 15 kommentarer og
1 løsning

Hente/bruge querystring i xsl ?

Hejsa

Jeg har nu ledt som en gal (synes jeg) og prøvet at lave f.eks. links med default.asp?p=1. Hvordan får jeg brugt querystring("p") ?

Og kan det lade sig gøre med xsl eller skal jeg over og bruge xmlDom.loadXML xmlHttp.responseText ?

Mine nuværende filer:
----- XML filen -----
<?xml version="1.0" encoding="UTF-8"?>
<Data>
    <Menulist>
        <Menu>
            <Index>1</Index>
            <MenuLink>default.asp?p=1</MenuLink>
            <MenuCat>Main</MenuCat>
            <MenuShowSub />
            <MenuCatNo />
            <MenuText>Forside</MenuText>
            <MenuHead>Dette er overskriften</MenuHead>
            <MenuCont>Dette er brod-teksten</MenuCont>
            <MenuSort>1</MenuSort>
            <Visible>1</Visible>
        </Menu>
        <Menu>
            <Index>2</Index>
            <MenuLink>default.asp?p=2</MenuLink>
            <MenuCat>Main</MenuCat>
            <MenuShowSub />
            <MenuCatNo />
            <MenuText>Side 2</MenuText>
            <MenuHead>Dette er overskriften til side 2</MenuHead>
            <MenuCont>Dette er brod-teksten side 2</MenuCont>
            <MenuSort>3</MenuSort>
            <Visible>1</Visible>
        </Menu>
        <Menu>
            <Index>3</Index>
            <MenuLink>default.asp?p=3</MenuLink>
            <MenuCat>Sub</MenuCat>
            <MenuShowSub>0</MenuShowSub>
            <MenuCatNo>1</MenuCatNo>
            <MenuText>Under kategori til forsiden</MenuText>
            <MenuHead>Dette er overskriften til sub-menu</MenuHead>
            <MenuCont>Dette er brod-teksten til sub-menu</MenuCont>
            <MenuSort>2</MenuSort>
            <Visible>1</Visible>
        </Menu>
    </Menulist>
</Data>

----- XSL filen -----
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="html"/>
    <xsl:template match="/">
        <html>
            <head></head>
            <body>
                <table>
<xsl:for-each select="Data/Menulist/Menu">

    <xsl:sort select="MenuSort" data-type="number" />
    <xsl:if test="Visible=1">
        <xsl:if test="MenuCat='Main'">
            <tr><td><a href=""><xsl:value-of select="MenuText"/></a></td></tr>
        </xsl:if>
        <xsl:if test="MenuCat='Sub'">
            <xsl:if test="MenuShowSub=1">
                <tr><td>- <xsl:value-of select="MenuText"/></td></tr>
            </xsl:if>
        </xsl:if>
    </xsl:if>
</xsl:for-each>
                </table>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

----- ASP filen -----
<%
Response.Buffer = True

Dim xml
Dim xsl

Set xml = Server.CreateObject("Microsoft.XMLDOM")
xml.async = false
xml.load (Server.MapPath("books01.xml"))

Set xsl = Server.CreateObject("Microsoft.XMLDOM")
xsl.async = false
xsl.load (Server.MapPath("books01.xsl"))

Response.ContentType = "text/html"
Response.Write "<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.01 Transitional//EN"">"
Response.Write (xml.transformNode(xsl))
%>

Mvh. Odie
Avatar billede tdafoobar Nybegynder
24. maj 2006 - 09:00 #1
Du skal enten tilføjde en node med værdien af din querystring, eller bruge javascript
Avatar billede tdafoobar Nybegynder
24. maj 2006 - 09:01 #2
og vent , læste forkert

<a href="default.asp?p={MenuLink}"><xsl:value-of select="MenuText"/></a> skulle gøre tricket :)
Avatar billede tdafoobar Nybegynder
24. maj 2006 - 09:03 #3
bah, <a href="{MenuLink}"><xsl:value-of select="MenuText"/></a> var hvad jeg mente, forkert c&p.

<a href="default.asp?p={Index}"><xsl:value-of select="MenuText"/></a> er også en mulighed, så slipper du for at have en seperate node til linket.
Avatar billede odie Nybegynder
24. maj 2006 - 09:07 #4
Super. Der kom linket korrekt med..

Hvordan bruger jeg så "p=1"

Hvis du f.eks. kikker på koden, kommer flg. resultat nu:

Forside
Side 2

Så vil jeg have at man skal trykke på "Forside" linket, da MenuCatNo henviser til 1 (Forside) og derefter skal Data/Menulist/Menu/Index=3 vises, altså

Forside
- Under kategori til forsiden
Side 2

??

Ps. Jeg er overhovedet ikke god til XML endnu, så vil meget gerne have et eksempel ligesom du gav i dit første svar.

Mvh.
Odie
Avatar billede odie Nybegynder
24. maj 2006 - 09:08 #5
Den med linket så jeg og fik ændret ;-)
Avatar billede tdafoobar Nybegynder
24. maj 2006 - 09:18 #6
Så slipper du ikke for enten

a) Loade xml dokumentet ind i Javscript, og vise de dele du gerne vil
- Træls, ikke indexbar, og svært at få til at virke optimalt i flere browsere.

b) Tilføje en ny node du kan selecte på via. ASP.
- Jeg ved ikke hvordan man bruger DOM under asp, så jeg vil foreslå du kigger i asp sektionen efter det.

--- Derudover fandt jeg din XSL lidt dårlig, her er en modificeret udgave, inc. doctype ---
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml"
  media-type="text/html"
  cdata-section-elements="style"
  encoding="utf-8"
  doctype-public="-//W3C//DTD XHTML 1.1//EN" doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"
  indent="yes"
  />
  <xsl:template match="/">
    <html>
      <head>
        <title>book xslt sjov</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      </head>
      <body>
        <table>
          <xsl:for-each select="Data/Menulist/Menu">
            <xsl:sort select="MenuSort" data-type="number" />
            <xsl:if test="Visible=1">
              <xsl:if test="MenuCat='Main'">
                  <tr><td><a href="{MenuLink}"><xsl:value-of select="MenuText"/></a></td></tr>
              </xsl:if>
              <xsl:if test="MenuCat='Sub'">
                  <xsl:if test="MenuShowSub=1">
                      <tr><td>- <xsl:value-of select="MenuText"/></td></tr>
                  </xsl:if>
              </xsl:if>
            </xsl:if>
          </xsl:for-each>
        </table>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>
Avatar billede tdafoobar Nybegynder
24. maj 2006 - 09:20 #7
Men tricket er at få asp til at tilføje en <p> node, med værdien af Request.QueryString("p"); og så gøre

<xsl:if test="//p = MenuIndex">
  vis indholdet her
</xsl:if>
Avatar billede odie Nybegynder
24. maj 2006 - 09:21 #8
Okie. Det vil jeg prøve.. Takker mange gange.. Jeg er helt klart kommet videre i mit problem.

Thx

/Odie
Avatar billede tdafoobar Nybegynder
24. maj 2006 - 09:28 #9
Et php eksemple.

--- xslt ---
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml"
  media-type="text/html"
  cdata-section-elements="style"
  encoding="utf-8"
  doctype-public="-//W3C//DTD XHTML 1.1//EN" doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"
  indent="yes"
  />
  <xsl:template match="/">
    <html>
      <head>
        <title>book xslt sjov</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      </head>
      <body>
        <table>
          <xsl:for-each select="Data/Menulist/Menu">
            <xsl:sort select="MenuSort" data-type="number" />
            <xsl:if test="Visible=1">
              <xsl:if test="MenuCat='Main'">
                <tr><td><a href="{MenuLink}"><xsl:value-of select="MenuText"/></a></td></tr>
              </xsl:if>
              <xsl:if test="MenuCat='Sub'">
                <xsl:if test="//p = MenuCatNo">
                  <tr><td>- <xsl:value-of select="MenuText"/></td></tr>
                </xsl:if>
              </xsl:if>
            </xsl:if>
          </xsl:for-each>
        </table>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

--- php ---

<?php

$proc = new XSLTProcessor();

$xml = new DomDocument;
$xml->load('book.xml');

if(isset($_GET['p']))
{
  $xml->lastChild->appendChild($xml->createElement('p',$_GET['p']));
}

$xsl = new DomDocument;
$xsl->load('book.xsl');

$proc->importStyleSheet($xsl);
$transformed = $proc->transformToXML($xml);

echo $transformed;

?>
Avatar billede tdafoobar Nybegynder
24. maj 2006 - 09:31 #10
asp syntax burde være noget ala.

xsl.lastChild.appendChild(xsl.createElement("p",Request.QueryString("p"))
Avatar billede odie Nybegynder
24. maj 2006 - 10:13 #11
Hmm driller lidt, men jeg må lege videre i weekenden..

Takker mange gange !

/Odie
Avatar billede Slettet bruger
24. maj 2006 - 10:58 #12
En simplere approach ville være flg.:

* Din XML er uændret.
* Din XSLT har i princippet to templates - een til normale menupunkter, og een til det valgte. Stylesheet'et har desuden
  en <xsl:variable>der får værdien af din QueryString parameter
* ASP filen overfører QueryString parameteren til stylesheet'et

- men jeg kan se spm. er besvaret :-)

/CS
Avatar billede Slettet bruger
24. maj 2006 - 10:59 #13
Ups - det er <xsl:param> og ikke <xsl:variable> der kan overføres værdier til...

/CS
Avatar billede tdafoobar Nybegynder
24. maj 2006 - 11:00 #14
Min var nu mere simpel

* Din XSLT har i princippet to templates - een til normale menupunkter, og een til det valgte.

er jo ikke nødvendig i min :) <xsl:variable> er også en mulighed, men det afhænger om ASP har mulighed for at sætte disse i dens parsing (php kan). Personligt foretrækker jeg et ekstra element.
Avatar billede odie Nybegynder
24. maj 2006 - 12:08 #15
Fik alligevel leget lidt mere med det. Løsningen blev sådanne:

---- XSL filen ----
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" media-type="text/html" cdata-section-elements="style" encoding="utf-8" doctype-public="-//W3C//DTD XHTML 1.1//EN" doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" indent="yes" />

  <xsl:param name="p"></xsl:param>
 
  <xsl:template match="/">

    <html>
      <head>
        <title>book xslt sjov</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      </head>
      <body>
       
        <table>
          <xsl:for-each select="Data/Menulist/Menu">
            <xsl:sort select="MenuSort" data-type="number" />
            <xsl:if test="Visible=1">
              <xsl:if test="MenuCat='Main'">
                <tr>
                  <td>
                    <a href="{MenuLink}">
                      <xsl:value-of select="MenuText"/>
                    </a>
                  </td>
                </tr>
              </xsl:if>
             
              <xsl:if test="MenuCat='Sub' and MenuShowSub=1 and MenuCatNo=$p"> 
                <tr>
                  <td>
                    - <xsl:value-of select="MenuText"/>
                  </td>
                </tr>
              </xsl:if>
            </xsl:if>
          </xsl:for-each>
        </table>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

---- ASP filen ----
<%
set xslt = Server.CreateObject("Msxml2.XSLTemplate")
set xslDoc = Server.CreateObject("Msxml2.FreeThreadedDOMDocument")
xslDoc.async = false
xslDoc.load(Server.MapPath("books01.xsl"))
xslt.stylesheet = xslDoc

dim xmlDoc
set xmlDoc = Server.CreateObject("Msxml2.DOMDocument")
xmlDoc.async = false
xmlDoc.load(Server.MapPath("books01.xml"))

dim xslProc
set xslProc = xslt.createProcessor()
xslProc.addParameter "p", cstr(Request.QueryString("p"))
xslProc.input = xmlDoc

xslProc.transform()
response.write xslProc.output
%>

Greystate> Du ledte mig den rigtige vej.. Vil du have point ? For så opretter jeg et nyt til dig. ?

Tak til jer begge 2 !

/Odie
Avatar billede Slettet bruger
24. maj 2006 - 13:35 #16
Jamen se nu dér, det var jo nemt nok :-)

Gem du bare dine point - skulle det være en anden gang.

/CS
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