Avatar billede dotcom1 Nybegynder
10. december 2009 - 11:31 Der er 13 kommentarer og
1 løsning

Selectbox med data fra xml

Hej.

Jeg har et xml-feed med f.eks følgende data:

<Categories>
<Item type="position-type" id="13059">Type 1</Item>
<Item type="position-type" id="13060">Type 2</Item>
<Item type="duration" id="permanent">Fast</Item>
<Item type="extent" id="fulltime">Heltid</Item>
<Item type="operating-time" id="day">Dag</Item>
</Categories>

Jeg vil gerne lave en selectbox med f.eks. alle forekomster af position-type.

Har bl.a. skrevet dette - ved ikke om jeg er på rette vej:

<form name="my_search" action="/index.html" method="post">
  <input type="hidden" name="iso" value="dk" />
    <select class="combo" name="cat" id="cat">
    <option value="0" selected="selected">--</option>
    <xsl:for-each select="ns:Versions/ns:Version/ns:Categories/ns:Item"/>
    <option value="position()"><xsl:value-of select="position()"/></option>
    </xsl:for-each>
    </select>
    </form>

- men hvordan får jeg fat i typen og id'et?

Håber nogen kan hjælpe.

På forhånd tak.
Avatar billede dotcom1 Nybegynder
17. december 2009 - 12:17 #1
Hmm, ingen der kan hjælpe? Jeg lukker indtil videre...
Avatar billede jokkejensen Novice
25. maj 2010 - 10:42 #2
<option value="{@id}"><xsl:value-of select="@type"/></option>
Avatar billede dotcom1 Nybegynder
25. maj 2010 - 13:43 #3
Hej.

Havde helt glemt dette spørgsmål, som aldrig blev løst. :) Jeg har prøvet dit forslag, men får blank skærm og følgende fejl:

Fejl: malplaceret mærke. Forventede: </select>.
Kildefil: http://mydomain.com/files/style.xsl
Linje: 15, Kolonne: 7
Kildekode: </xsl:for-each>

Min kode ser således ud:

<form name="my_search" action="/index.html" method="post">
<input type="hidden" name="iso" value="dk" />
<select class="combo" name="cat" id="cat">
<xsl:for-each select="ns:Versions/ns:Version/ns:Categories/ns:Item"/>
<option value="{@id}"><xsl:value-of select="@type"/></option>
</xsl:for-each>
</select>
</form>
Avatar billede jokkejensen Novice
25. maj 2010 - 13:59 #4
du har også lukket den for-each forkert.

Jeg kopierede bare :)

/J
Avatar billede jokkejensen Novice
25. maj 2010 - 13:59 #5
<xsl:for-each select="ns:Versions/ns:Version/ns:Categories/ns:Item"/>

rettes til:

<xsl:for-each select="ns:Versions/ns:Version/ns:Categories/ns:Item">
Avatar billede dotcom1 Nybegynder
25. maj 2010 - 14:13 #6
Ok, beklager. :)

Ingen fejl nu, men der dukker ikke noget op i selectboxen:

<form name="my_search" action="/index.html" method="post">
<input type="hidden" name="iso" value="dk" />
<select class="combo" name="cat" id="cat">
<option value="0" selected="selected">--</option>
<xsl:for-each select="ns:Versions/ns:Version/ns:Categories/ns:Item">
<option value="{@id}"><xsl:value-of select="@type"/></option>
</xsl:for-each>
</select>
</form>


- så det er som om den ikke fanger indholdet i xml-feedet. Jeg går ud fra at du gerne vil se det rigtige xml-feed eller et link til min test?
Avatar billede jokkejensen Novice
25. maj 2010 - 14:19 #7
ja hvis du har det ?

Hvorfor bruger du de ns: namespace angivelser foran noder i xpathen ?

Vh.
Avatar billede dotcom1 Nybegynder
25. maj 2010 - 14:27 #8
Hmm, godt spørgsmål. Jeg har fundet nogle tutorials på nettet, som fik mig i gang. Det er nok bare dårlig stil så...

Jeg kan ikke rigtig vise min test offentligt, men jeg kan måske sende en mail til dig med et link i?

Mvh.
Avatar billede jokkejensen Novice
25. maj 2010 - 14:32 #9
ja, send til min email og ikke msn :)

/J
Avatar billede jokkejensen Novice
25. maj 2010 - 15:06 #10
<xsl:for-each select="//ns:Categories/ns:Item">
          <option value="{@id}"><xsl:value-of select="@type"/></option>
        </xsl:for-each>

Prøv den.

Bemærk at jeg vælger ALLE kategorier og deres items.

/J
Avatar billede dotcom1 Nybegynder
25. maj 2010 - 15:25 #11
Jep, så skete der noget. Hvis man nu vil udskrive teksten i hver option: <Item type="duration" id="permanent">Fast</Item> - i dette tilfælde "Fast"?

Det, jeg i virkeligheden gerne vil - i sidste ende - er at have 5 selectboxes defineret pr. type, som udskriver alle items inden for sin type:

<Categories>
<Item type="position-type" id="13059">Stillingstype 1</Item>
<Item type="job-level" id="13058">Type / niveau 1</Item>
<Item type="duration" id="permanent">Fast</Item>
<Item type="extent" id="fulltime">Heltid</Item>
<Item type="operating-time" id="day">Dag</Item>
</Categories>


Ovenstående ville resultere i 5 bokse: en med position-type, en med job-level, en med duration, en med extent og en med operating-time. Værdien af disse items kan variere.

Meningen er at man skal kunne sortere en liste ud fra disse værdier.

Håber det giver mening...
Avatar billede jokkejensen Novice
31. maj 2010 - 10:05 #12
Prøv den her, det er for "duration"


<xsl:variable name="DurationItems">
                        <root>
                            <xsl:for-each select="//ns:Item[@type = 'duration']">
                                <xsl:copy-of select="."/>
                            </xsl:for-each>
                        </root>
                    </xsl:variable>
                    <select class="combo" name="duration" id="duration">
                        <xsl:for-each select="msxml:node-set($DurationItems)/root//node()[text() != '' and not(text()=preceding-sibling::node()/text())]">
                            <xsl:variable name="pos" select="position()"></xsl:variable>
                            <xsl:choose>
                                <xsl:when test="position() = 1">
                                    <option value="">
                                        Vælg
                                    </option>
                                </xsl:when>
                                <xsl:otherwise>
                                    <option value="{@id}">
                                        <xsl:value-of select="text()"/>
                                    </option>
                                </xsl:otherwise>
                            </xsl:choose>
                        </xsl:for-each>
                    </select>


Tilføj det her til toppen:


<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:msxml="urn:schemas-microsoft-com:xslt" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns="urn:EasyCruit">

Du skal så lave for hver <select>

/J
Avatar billede dotcom1 Nybegynder
08. juni 2010 - 10:51 #13
Hej igen - og tusind tak for dit svar. Det virker i IE! Jeg får umiddelbart en blank side i Firefox og en fejl, der refererer til parseren:

Error: Component returned failure code: 0x8060000e [nsIXSLTProcessor.transformToFragment] = <unknown>
Source file: http://mydomain.com/jobliste.html
Line: 45, som er denne:  resultDocument = xsltProcessor.transformToFragment(xml,document);

Koden er:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script type="text/javascript" src="/files/scripts.js"></script>
<script type="text/javascript">
function loadXMLDoc(fname)
{
var xmlDoc;
// code for IE
if (window.ActiveXObject)
  {
  xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
  }
// code for Mozilla, Firefox, Opera, etc.
else if (document.implementation
&& document.implementation.createDocument)
  {
  xmlDoc=document.implementation.createDocument("","",null);
  }
else
  {
  alert('Your browser cannot handle this script');
  }
xmlDoc.async=false;
xmlDoc.load(fname);
return(xmlDoc);
}

function displayResult()
{
xml=loadXMLDoc("http://link.to/xmlfile.xml");
xsl=loadXMLDoc("http://link.to/xmlfile/style.xsl");
// code for IE
if (window.ActiveXObject)
  {
  ex=xml.transformNode(xsl);
  document.getElementById("example").innerHTML=ex;
  }
// code for Mozilla, Firefox, Opera, etc.
else if (document.implementation
&& document.implementation.createDocument)
  {
  xsltProcessor=new XSLTProcessor();
  xsltProcessor.importStylesheet(xsl);
  resultDocument = xsltProcessor.transformToFragment(xml,document);
  document.getElementById("example").appendChild(resultDocument);
  }
}
</script>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Test</title>
</head>
<body class="index" onload="displayResult()">
<div id="example"></div>
</body>
</html>

Jeg prøver lige at se om jeg kan gennemskue at lave de andre selects. Hvordan skal en udfør-knap se ud?
Avatar billede dotcom1 Nybegynder
10. juni 2010 - 14:23 #14
Hej.

Jeg har oprettet et spørgsmål til dig her: http://www.eksperten.dk/spm/911790 så du kan få nogle velfortjente points. Jeg kan helt sikkert komme videre nu.

Mange tak for din hjælp.
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