[xsl] hoe krijg je user-input naar XSL variable?

Pagina: 1
Acties:

  • AxiMaxi
  • Registratie: December 2000
  • Laatst online: 27-05 15:33
Hoi peoples,

Hoe krijg je user-input, bijv. uit <INPUT type="text" name="zoek">, in XSL variable $zoek? :?

Het stukje waar het om gaat:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?xml version="1.0" ?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:output method="html" /> 
<xsl:template match="/">

 <html><head><title>Online Documentatie Archief</title></head>

 <body>

<!-- STOP HIER (ter plaatse van deze regel) DE USER-INPUT IN VARIABLE $zoek -->

  <span>Er wordt gezocht op: <xsl:value-of select="$zoek" /></span>

<!-- start tabel -->
  <table border="0" width="765" cellpadding="4">
    <xsl:for-each select="/catalogus/item">

     <xsl:variable name="hit" select="trefwoord" /> 

<!-- check of tussen de trefwoorden het gezochte woord zit -->
     <xsl:if test="contains($hit,$zoek)">

<!-- als er een hit is, dan de titel weergeven met overige info -->
   <tr>
    <td>
     <span><xsl:value-of select="@id" />
     : <b><xsl:value-of select="titel" /></b></span><br /> 
     <span><xsl:value-of select="beschrijving" /></span><br /> 

     <span><i>door: <xsl:value-of select="auteur" /></i><br /> 
     <i>copyright: <xsl:value-of select="copyright" /></i><br /></span>
    </td>

    <td>[img]"{@id}.gif"[/img]</td>
  </tr>

    </xsl:if>
   </xsl:for-each>
  </table>

<!-- EOF -->
 </body></html>
</xsl:template></xsl:stylesheet>

[Hier had mijn handtekening kunnen staan]


  • SillyJW
  • Registratie: Januari 2002
  • Laatst online: 22-04 18:09

SillyJW

der Gemutlichkeit

Zo Axi.....jij heb flink zitten lezen :)
(Geef die jongen een tip, ... ;) )

Maareuhm on-topic...
Is dit op deze manier uberhaupt wel mogelijk in xml?
Of vermoed je dat het zo kan?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Je kan parameters aan een XSL Transformatie meegeven (zie de standaard of de tutorial op http://www.xfront.com ). Hiermee zou je het wellicht op kunnen lossen. Het is (in principe) niet mogelijk om tijdens een transformatie even om user-input gaan vragen. XSLT is op dit punt heel anders dan een gewone programmeertaal.

Stiekem kan het met hele ranzige trucks en bepaalde transformatie engines wel, maar het is absoluut niet de bedoeling.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • AxiMaxi
  • Registratie: December 2000
  • Laatst online: 27-05 15:33
Ah, mr. Bravenboer _/-\o_ Just the guy I needed ;)

Misschien andersom dan: in JavaScript de input regelen en dan XML parsen in JavaScript en de functie uitvoeren, desnoods met vage truuks?

Wat de bedoeling van XSLT is, kan me niet zoveel schelen; het doel telt })

Die XFront tut heb ik wel doorgekeken, maar ik kon het zo gauw eigenlijk niet vinden. Zal 't nog 's op m'n gemakkie doorlezen.

BTW, SillyJW, indrukwekkend toch? :+
Minder dan een week geleden had ik nog nooit van XML gehoord...

[ Voor 0% gewijzigd door AxiMaxi op 20-08-2002 13:15 . Reden: anders geformuleerd ]

[Hier had mijn handtekening kunnen staan]


  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
hej dit wilde ik nu gisteren ook voor elkaar krijgen. het enige dat ik echter door wilde passen waren wat URL parameters naar een frameset, dus had ik geen relevante XML data om te tranformeren. Toen heb ik maar een foo.xml gemaakt met een lege tag. Uiteindelijk weet ik niet of dit zo kon werken (met <xsl:param name="varname"/>), want ik deed vanalles fout. Ik wist niet wat en ik vond het toch ook maar een beetje 'ugly' dat ik eigenlijk niks te transformeren had.

Dus uiteindelijk ipv van foo.xml + xsl -> html maar xsp -> html gebruikt (ik gebruik cocoon2).
mbravenboer zou je zeggen dat die oplossing formeel gezien "beter" is?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
AxiMaxi: Misschien andersom dan: in JavaScript de input regelen en dan XML parsen in JavaScript en de functie uitvoeren, desnoods met vage truuks?
Allemaal prima: het gaat erom dat je parameters moet meegeven aan de XSL Transformatie. Je probleem is dus in feite "hoe geef ik een parameter mee aan mijn stylesheet?". Je hebt volgens mij nog niet omschreven hoe je de transformatie toepast (in een browser, server-side, normale applicatie ...) en daarom is het lastig om hier een concrete tip over te geven.

Vanuit je XSL Transformatie zie ik maar 1 mogelijkheid: URIResolver. De meeste XSLT engines bieden namelijk de mogelijkheid om een URIResolver in te stellen op de klasse die de transformatie uitvoert. Behalve het resolven van een URI kan je echter ook hele andere ranzige dingen doen als je dat wilt ;) . Zoals bijvoorbeeld vragen om user-input. Dit zal echter natuurlijk niet gaan werk als je de transformatie server-side toepast en helemaal niet als je hem door de browser laat toepassen via de <?stylesheet processing instruction.
Die XFront tut heb ik wel doorgekeken, maar ik kon het zo gauw eigenlijk niet vinden. Zal 't nog 's op m'n gemakkie doorlezen.
Zou ik zeker doen: het is een hele degelijke en prettig introductie in XSLT :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Genoil: Het enige dat ik echter door wilde passen waren wat URL parameters naar een frameset, dus had ik geen relevante XML data om te tranformeren.
Ja, dat probleem heb ik ook weleens gehad ja. Ik wilde verschillende files combineren met een XSL Transformatie (document functie dus), maar had eigenlijk niet echt 1 duidelijke bron. Ik heb toen ook een soort dummy file genomen ... Misschien allemaal niet zo mooi, maar XSLT is ook niet op alle punten mooi, dus dan mogen wij ook weleens zondigen ;) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • AxiMaxi
  • Registratie: December 2000
  • Laatst online: 27-05 15:33
mbravenboer schreef op 20 augustus 2002 @ 19:30:
Allemaal prima: het gaat erom dat je parameters moet meegeven aan de XSL Transformatie. Je probleem is dus in feite "hoe geef ik een parameter mee aan mijn stylesheet?".
Ik heb dezelfde vraag gesteld op het forum van DevShed, en daar kwam iemand met een link naar een pagina op MSDN.

Hierop wordt gesproken over een DOM mogelijkheid 'addParam'. Met andere woorden: parse de XML/XSL met JavaScript en stuur er met DOM een param naartoe. Ik weet niet of ik het helemaal goed zeg, want ik heb de code nog niet kunnen bestuderen.
mbravenboer schreef op 20 augustus 2002 @ 19:30:
Je hebt volgens mij nog niet omschreven hoe je de transformatie toepast (in een browser, server-side, normale applicatie ...) en daarom is het lastig om hier een concrete tip over te geven.
Het gaat om een online documentatie-catalogus op ons intranet.
De bedoeling is dat werknemers (allen met MSIE 6) kunnen zoeken of wij ergens in ons bedrijf documentatie hebben over een op te geven onderwerp.

Dit kan heel goed met ASP (dus server-side); daar zitten alleen 2 maren aan:

1) ik heb nog nooit met ASP gewerkt. Het ziet er niet moeilijk uit, maar ik voel er weinig voor om nog een taal erbij te leren.
2) hetzelfde principe wil ik toe gaan passen op een andere database, die op CD moet komen en dus zonder server moet kunnen draaien.

De constructie is dus:
- XML bestand met de data
- XSL(T)/(D)(X)HTML/DOM/JavaScript pagina's om de data op te halen.

Als het maar werkt in MSIE 6, ben ik tevreden. :7
mbravenboer schreef op 20 augustus 2002 @ 19:30:
Vanuit je XSL Transformatie zie ik maar 1 mogelijkheid: URIResolver. (...) Dit zal echter natuurlijk niet gaan werk als je de transformatie server-side toepast en helemaal niet als je hem door de browser laat toepassen via de <?stylesheet processing instruction.
Dan is het geen optie, schat ik in.

P.S. wat zit er een hoop ruimte tussen een quote en mijn tekst... :|

[Hier had mijn handtekening kunnen staan]


  • roelkw
  • Registratie: Augustus 2000
  • Laatst online: 23-08 13:48
Misschien is het in principe wel mogelijk met JavaScript en XSL, als je bijvoorbeeld JavaScript de querystring uit de URL laat lezen. De complete URL, met gegevens erin, kun je ook door JavaScript laten fabriceren. JavaScript kan dan misschien ook nog wel de XSL/XML schrijven. Toch denk ik eigenlijk dat je naar een andere optie moet gaan zoeken, zoals PHP (of ASP)

  • AxiMaxi
  • Registratie: December 2000
  • Laatst online: 27-05 15:33
roelkw schreef op 21 augustus 2002 @ 10:42:
Misschien is het in principe wel mogelijk met JavaScript en XSL, als je bijvoorbeeld JavaScript de querystring uit de URL laat lezen. De complete URL, met gegevens erin, kun je ook door JavaScript laten fabriceren. JavaScript kan dan misschien ook nog wel de XSL/XML schrijven. Toch denk ik eigenlijk dat je naar een andere optie moet gaan zoeken, zoals PHP (of ASP)
Nee, dat werkt niet. Dat blijf je met je querystring in het JS domein en het moet juist naar de <xsl:if ...> tag (of eigenlijk de $zoek variable in XSL) t.b.v. de zoekfunctie in XSL.

Als ik in JavaScript kan gaan zoeken in de XML database, ben ik ook geholpen, trouwens. Dan vervalt de <xsl:if ...> toestand en wordt dat JS.
Maar ik weet ff niet hoe ik JS moet gebruiken om XML uit te pluizen.
Met DOM kan ik het wel op het scherm toveren, maar dan ben ik er nog niet... :/

BTW, wat een nerdspeak allemaal B)

[Hier had mijn handtekening kunnen staan]


  • AxiMaxi
  • Registratie: December 2000
  • Laatst online: 27-05 15:33
Nou, volgens mij ben ik eruit. :)

In VBScript (zal dus ook wel in JavaScript kunnen), is het mogelijk om de naam en de inhoud van XML nodes te bepalen d.m.v. DOM. Als ik dus een variabele in het script neem (de query-string, gevuld met user-input) en die vergelijk met de inhoud van de te benoemen XML-node (in dit geval <TREFWOORD>), dan heb ik het volgens mij voor elkaar.

's Proberen...

edit:

Daar komt dus eigenlijk geen XSLT meer aan te pas, als ik er zo over nadenk.
Dat hoeft natuurlijk ook niet, maar ik zat ff in die richting te denken en dan loop je hopeloos vast... dus... 8)7

[ Voor 0% gewijzigd door AxiMaxi op 21-08-2002 13:28 . Reden: toevoeging ]

[Hier had mijn handtekening kunnen staan]


  • roelkw
  • Registratie: Augustus 2000
  • Laatst online: 23-08 13:48
AxiMaxi schreef op 21 augustus 2002 @ 12:45:
[...]
Nee, dat werkt niet. Dat blijf je met je querystring in het JS domein en het moet juist naar de <xsl:if ...> tag (of eigenlijk de $zoek variable in XSL) t.b.v. de zoekfunctie in XSL.
Zit wat in..
Als ik in JavaScript kan gaan zoeken in de XML database, ben ik ook geholpen, trouwens. Dan vervalt de <xsl:if ...> toestand en wordt dat JS.
Maar ik weet ff niet hoe ik JS moet gebruiken om XML uit te pluizen.
Met DOM kan ik het wel op het scherm toveren, maar dan ben ik er nog niet... :/
Ik denk dat het wel kan met JavaScript hoor, beetje zoeken in XML, maar ik denk dat je dan ongeveer zelf een heel script moet gaan schrijven om JavaScript XML te laten begrijpen. Dus gewoon zoeken op <*string1*>*string2*<*/string1*>, dat zou kunnen, maar das echt een verschrikkelijk karwei..
BTW, wat een nerdspeak allemaal B)
kun je wel zeggen jah :'(:P

  • AxiMaxi
  • Registratie: December 2000
  • Laatst online: 27-05 15:33
roelkw schreef op 21 augustus 2002 @ 14:20:
Ik denk dat het wel kan met JavaScript hoor, beetje zoeken in XML, maar ik denk dat je dan ongeveer zelf een heel script moet gaan schrijven om JavaScript XML te laten begrijpen.
Welnee, kan je met DOM doen:
code:
1
2
3
4
5
6
<script type="text/javascript">
  var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
  xmlDoc.async="false"
  xmlDoc.load("note.xml")
// ....... en dan hier de rest van je script
</script>


Da's dus de moeilijkheid niet, maar lees verder... :|
roelkw schreef op 21 augustus 2002 @ 14:20:
Dus gewoon zoeken op <*string1*>*string2*<*/string1*>, dat zou kunnen, maar das echt een verschrikkelijk karwei..
Op zich is dat zoeken naar strings ook niet zo lastig (gewoon met substring() enzo), ware het niet dat ik op een nieuw probleem stuit...

Stel, ik heb de volgende data in XML
code:
1
2
3
4
5
 <boek id="001">
   <titel>XML in dertien delen</titel>
   <auteur>Xander M. Landgraaf</auteur>
   <trefwoord>XML, DOM, XSL, XSLT</trefwoord>
 </boek>

Nu kan je in JavaScript xmlDoc.documentElement.childNode (misschien klopt dit niet helemaal, ik doe 't ff uit m'n hoofd) gebruiken, maar dan krijg je dus:

XML in dertien delenXander M. LandgraafXML, DOM, XSL, XSLT

in je string te staan; kortom, alle data aan elkaar in één geheel. |:(

Ik kan de afzonderlijke <tags> niet splitsen, simpelweg omdat ik niet weet hoe (en ik kan het ook nergens vinden op internet).
Ik wil dus een JavaScript variabele kunnen maken van <titel>, <auteur> en <trefwoord> apart. Dan kan ik wat gerichter de zoek actie uitvoeren.

Dit probleem ga ik maar ff in een nieuwe thread posten ;(

[Hier had mijn handtekening kunnen staan]


Verwijderd

Met ASP (haal er even uit wat je nodig hebt objXML is je XML document):

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
----hierboven staat nog wat code op objXML te maken------

dim xslt, xslDoc, xslProc

set xslt = CreateObject("Msxml2.XSLTemplate")
set xslDoc = CreateObject("Msxml2.FreeThreadedDOMDocument")
        xslDoc.async = false
        xslDoc.load Server.MapPath("xsl\"&sProductCode&"_overview.xsl")
        set xslt.stylesheet = xslDoc

        set xslProc = xslt.createProcessor()
        xslProc.input = objXMLDoc
        
        xslProc.addParameter "sCustomer", "" & Session("sCustomer") & ""
        xslProc.transform()


in javascript:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<HTML>
<HEAD>
   <SCRIPT language="jscript">
      var objSrcTree, ObjXSLT, objCache;

      function init()
      {
         objSrcTree = new ActiveXObject('MSXML2.DOMDocument.4.0');
         objSrcTree.async = false;
         objSrcTree.load('sample.xml');

         objXSLT=new ActiveXObject('MSXML2.FreeThreadedDOMDocument.4.0');
         objXSLT.async = false;
         objXSLT.load('sample.xsl');

         objCache   = new ActiveXObject("Msxml2.XSLTemplate.4.0");
         objCache.stylesheet = objXSLT;

         output.innerHTML = "Select a book above to read the review!";
      }

      function show(title)
      {
         var objXSLTProc = objCache.createProcessor();
         objXSLTProc.input = objSrcTree;
         objXSLTProc.addParameter("title", title, "");
         objXSLTProc.transform();
         output.innerHTML = objXSLTProc.output;
      }

   </SCRIPT>
</HEAD>

<BODY onload="init();">
   <DIV>Books reviewed: 
        <A HREF="javascript:show('A Good Book')">A Good Book</A>
        <A HREF="javascript:show('A Bad Book')">A Bad Book</A>
        <A HREF="javascript:show('A So-so Book')">A So-so Book</A>
   </DIV>
   <DIV id="output" style="margin:1em"></DIV>
</BODY>
</HTML>


in alle gevallen moet je dan dit in je XSLT zetten:

in je XSLT:
code:
1
2
3
<xsl:param name="sCustomer" />

om te displayen <xsl:value-of select="$sCustomer"/> of bij een attribuut: <A href=blaat.asp?term={@sCustomer}>bolletjes</A>


btw ik heb wel MSXML4 geinstalleerd.

  • AxiMaxi
  • Registratie: December 2000
  • Laatst online: 27-05 15:33
Ah, meer code! Goed!
Ik kom m'n weekend wel door, schat ik :9~ :9
(Gelukkig heeft m'n vriendin avonddienst >:) )

Thanks, ik geloof dat ik er nu wel ben.

[Hier had mijn handtekening kunnen staan]

Pagina: 1