Avatar billede Mikker Praktikant
04. marts 2003 - 14:03 Der er 20 kommentarer og
1 løsning

Overførsel af xsl-variabel til JavaScript

Hvordan bruger jeg en xsl-variabel i mit JavaScript?

xsl-variablen er oprettet med
  <xsl:variable name="value">
  ...
  </xsl:variable>

Jeg skal lave noget RegExp på denne variabel, men i første omgang vil jeg bare have den skrevet ud med
  <script language="JavaScript" type="text/javascript">
      document.write(...);
  </script>

Hjææælp.
Avatar billede atoft Nybegynder
04. marts 2003 - 14:08 #1
I dit XSLT skriver du "bare"

document.write("<xsl:value-of select="$value" />");
Avatar billede Mikker Praktikant
04. marts 2003 - 14:10 #2
Fedt, tak.
Avatar billede Mikker Praktikant
05. marts 2003 - 10:59 #3
Kan man også gøre det modsatte? Altså tildele en JavaScript-variabel til xsl?
Avatar billede atoft Nybegynder
05. marts 2003 - 11:03 #4
Ja. Men det kræver lidt mere og jeg samler jo points :-)
Avatar billede atoft Nybegynder
05. marts 2003 - 11:06 #5
Det kan gøres på 2 måder.
Avatar billede Mikker Praktikant
05. marts 2003 - 11:07 #6
Hvad skal jeg gøre? (Altså med points'ne?)
Avatar billede atoft Nybegynder
05. marts 2003 - 11:14 #7
Aner det ikke men hvis du kan læse VBScript kan du kigge på følgende spørgsmål, som jeg har besvaret tidligere.

http://www.eksperten.dk/spm/319608

Så er denne på huset :-)
Avatar billede Mikker Praktikant
05. marts 2003 - 11:20 #8
Du må ellers gerne få nogle points, hvis jeg altså vidste hvordan man gør.

Nå, men jeg ser om jeg kan se noget ud fra det andet spørgsmål, ellers vender jeg frygtligt tilbage :o)
Avatar billede Mikker Praktikant
05. marts 2003 - 12:13 #9
Jeg har nu kigget på spm319608, men for en nybegynder (som mig) virker det noget uoverskueligt at se hvad det er jeg skal bruge.

Det er sikkert ganske simpelt...

Det drejer sig om flg. JavaScript :

<script language="JavaScript" type="text/javascript">
    // Sætter $value til værdien af xsl-value
    $value = "<xsl:value-of select="$value" />";
               
    // Regulært udtryk : E-mail starter med 8 tal
    var re = /(^\d{8}@[\w\._-]+\.[A-Za-z]{2,4}\S*)/;
               
  if(re.test($value)){
      $smsnumvalue = RegExp.$1;
      <xsl:variable name="smsnum">
          <xsl:value-of select="$smsnumvalue" />
      </xsl:variable>
                   
  }
</script>


Jeg skal simpelthen bare have værdien af JavaScript-variablen $smsnumvalue (eller RegExp.$1) ind i xsl-variablen $smsnum.

???
Avatar billede atoft Nybegynder
05. marts 2003 - 12:13 #10
Den anden måde du kan gøre det på er, blot at load dit xslt ind i xmldom.

Derefter kan du finde den node du vil ændre.

fx.

var node = xmldom.selectSingleNode("//minnode");
node.text = minJavaScriptVariabel;
Avatar billede Mikker Praktikant
05. marts 2003 - 12:22 #11
Er det noget jeg skal tilføje i mit JavaScript?

Hvis du kigger på if-delen af mit JavaScript, så er probelemet at xsl ikke kender variablen $smsnumvalue :

<xsl:value-of select="$smsnumvalue" />

Jeg får fejlen :
Could not find variable with the name of smsnumvalue
Avatar billede atoft Nybegynder
05. marts 2003 - 12:30 #12
Du kører jo først en transformering som danner din færdige hmtl side. HTML siden kender derfor ikke noget til xslt'en.

Det jeg tror du gerne vil er vel egengligt, at kun bruge noget javascript directe i forbindelse med din tranformering. I givet fald kan du gøre følgende, men det virker altså kun i med MSXML3.0+

&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                xmlns:user="http://mycompany.com/mynamespace"
                version="1.0"&gt;
  &lt;msxsl:script language="JScript" implements-prefix="user"&gt;
    function xml(nodelist) {
      return nodelist.nextNode().xml;
    }
  &lt;/msxsl:script&gt;

  &lt;xsl:template match="/"&gt;
    &lt;xsl:value-of select="user:xml(.)"/&gt;
  &lt;/xsl:template&gt;
&lt;/xsl:stylesheet&gt;
Avatar billede atoft Nybegynder
05. marts 2003 - 12:31 #13
og unden escaping :-)

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                xmlns:user="http://mycompany.com/mynamespace"
                version="1.0">
  <msxsl:script language="JScript" implements-prefix="user">
    function xml(nodelist) {
      return nodelist.nextNode().xml;
    }
  </msxsl:script>

  <xsl:template match="/">
    <xsl:value-of select="user:xml(.)"/>
  </xsl:template>
</xsl:stylesheet>
Avatar billede Mikker Praktikant
05. marts 2003 - 13:24 #14
Jeg er ikke helt med på hvad ovenstående gør?

Jeg har fået stukket et langt script i hånden, men den del som jeg arbejder med ser således ud:

<tr>
    <td> <!-- Link: e-mail - åbner e-mail hjælp -->
        <a class="csslabel" href="java script:openHelp            ('ChangeEmailEmailField')">
        <xsl:value-of select="key('screentext-index', 'ChangeEmailEmailField')/trimnode[@key='label']" />
        </a>
    </td>
    <td class="cssinput">
    <!-- Variablen value tildeles brugerens email-adresser -->
    <xsl:variable name="value">
        <xsl:choose>
                <!-- Hvis der eksisterer en email-adresse, -->
                <!-- sættes denne lig variablen value. -->
            <xsl:when test="/iimpage/parameters/parameter[@name='email']/parameter-value">
                <xsl:value-of select="/iimpage/parameters/parameter[@name='email']/parameter-value" />
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="resultdata/patron/email" />
            </xsl:otherwise>
        </xsl:choose>
        </xsl:variable>

    <script language="JavaScript" type="text/javascript">
            // Sætter $value til værdien af xsl-value
            $value = "<xsl:value-of select="$value" />";
               
            // Regulært udtryk : Starter med 8 tal
            var re = /(^\d{8}@[\w\._-]+\.[A-Za-z]{2,4}\S*)/;
            if(re.test($value)){
                  $smsnumvalue = RegExp.$1;
                <xsl:variable name="smsnum">
                  <xsl:value-of select="$smsnumvalue" />
                </xsl:variable>       
            }
        </script>
         
        <input name="email" type="text" tabindex="1" size="50" value="{$value}" />
    </td>
    <xsl:if test="key('settings-index', 'PincodeRequired')/text()='0'">
    <td>
    <xsl:copy-of select="$buttonpanel" />
    </td>
    </xsl:if>
</tr>


Hvor skal jeg bruge dit forslag?

Ovenstående script giver flg. fejl:
Could not find variable with the name of smsnumvalue
Avatar billede atoft Nybegynder
05. marts 2003 - 13:31 #15
Du kan betragte xslt konverteringen som serverside ASP. Det du laver i ASP kan du godt sætte ind i din html-side, men det du sætter ind variable du har i din htmlside kan du jo ikke sætte ind i din ASP kode igen - i hvertfaldt ikke unden at kører ASP siden igen.

Din XSLT transformering generer en HTML side og færdig. Det som måtte ske i HTML siden kender XSLT tranformeringen intet til.

Men bruger du som sagt msxml3.0+ kan du jo gøre som jeg har vist tidligere.
Avatar billede Mikker Praktikant
05. marts 2003 - 13:37 #16
De to første linjer i mit script ser således ud:
<?xml version="1.0" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

Kan jeg så ikke bruge dine eksempler?
Avatar billede atoft Nybegynder
05. marts 2003 - 13:40 #17
Det kan jeg ikke se ud af det.

Hvordan kører du din xml og xslt sammen?
Avatar billede Mikker Praktikant
05. marts 2003 - 13:59 #18
Det er noget Cocoon-halløj.
Avatar billede Mikker Praktikant
05. marts 2003 - 14:04 #19
Det jeg egentligt er igang med at lave, er at e-mail feltet kan indeholde flere adresser (så'n som det er nu). Hvis den første adresse er til en mobil-tlf. f.eks. 12345678@sendtilsms.dk, skal den flyttes ned i et særskilt input-felt.

Nu har jeg så fået adressen ind i RegExp.$1 hvis den starter med 8 tal. Nu skal jeg så have adressen ind i et input-felt.
Avatar billede Mikker Praktikant
05. marts 2003 - 14:05 #20
... og tilbage til xsl.
Avatar billede atoft Nybegynder
05. marts 2003 - 14:11 #21
Jo men du kan jo ikke får den tilbage for når du først har fået den ud i javascriptet er xslt tranformeringen jo færdig. Og det med er xslt'en jo væk.

Prøv i stedet at kigge på streng funktionerne i XSLT. De kan også bruges til at checke for om det de første 8 tegn er tal. Måske ikke så elegant som en RegExp men det kan lade sig gøre.
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