Avatar billede kimlarsen1978 Nybegynder
02. marts 2004 - 16:14 Der er 19 kommentarer og
1 løsning

Ny node og brug af denne

Hej på Eksperten
Jeg har et lille XML/XLS problem:

Jeg vil gerne have den værdi jeg tager fra min form sat i en "node" og have den sat på roden af mit XML dokument. Det kører på klienten der her.
---------------------
var vaerdi = document.soeg.produkt.value;
produktIdXML = "<varID produktID="'+vaerdi+'"</varID>;

var xmlDoc = new ActiveXObject('Msxml2.DOMDocument');
var xslDoc = new ActiveXObject('Msxml2.DOMDocument');
var xml = '<%=xml%>';
xmlDoc.loadXML(unescape(Xml));
xslDoc.load('output.xsl');
---------------------
Det der så var min plan var at bruge appendChild og sætte "produktIdXML ind med den, men et jeg ved ikke hvordan og 2 jeg ved ikke om det overhoved er måden at gøre det på.

Når det så er på plads vil jeg gerne kunne tilgå den nye node i mit XSL dodument
---------------------
<xsl:template match='start'>
  <xsl:apply-templates select='vare[@Produkt_id=MIN NYE NODE]'/>
</xsl:template>
---------------------

Kan noget hjælpe med det?
Avatar billede nute Nybegynder
02. marts 2004 - 17:09 #1
Dette er sådan set ikke et xml/xsl problem ... det er et DOM problem ;o]

anyway .. .hvornår er det du vil sætte den nye node ind i din xml ? er det på serversiden ?

du kan sagtens bruge appendchild, men du er nødt til at oprette noden inden du kan appende den. noget ála dette:

var objXMLDoc = new ActiveXObject('Msxml2.DOMDocument');
objXMLDoc.loadXML( "<root/>" );
var objRoot = objXMLDoc.documentElement;
var objNewNode = objXMLDoc.createElement( "varID" );
var objNewAttribute = objXMLDoc.createAttribute( "produktID" );
var objNewNodeAttributes = objNewNode.attributes;
objNewNodeAttributes.setNamedItem( objNewAttribute );
objRoot.appendChild( objNewNode );

når denne kode er færdig, så vil <root/> have blevet til <root><varID produktID=""/></root>

/nute
Avatar billede kimlarsen1978 Nybegynder
02. marts 2004 - 17:12 #2
Det er på klient siden jeg vil sætte den nye node ind.
Avatar billede kimlarsen1978 Nybegynder
02. marts 2004 - 17:14 #3
hvor bliver noden "tilknyttet" den eksisterende XML som jeg laver i
- xmlDoc.loadXML(unescape(Xml));
?
Avatar billede nute Nybegynder
02. marts 2004 - 17:24 #4
en lille forklaring til 5 linjer kode:

// Denne linje opretter din 'varID' node
var objNewNode = objXMLDoc.createElement( "varID" );
// Denne linje oppretter din 'produktID' attribut som du senere
// skal tilknytte den node du lige har oprettet
var objNewAttribute = objXMLDoc.createAttribute( "produktID" );
// denne linje hiver alle attributter ud fra den node du
// lige har oprettet. Der er ingen, men du er nødt til at have fat i
// denne collection
var objNewNodeAttributes = objNewNode.attributes;
// Denne linje tilknytter attributten til din node
objNewNodeAttributes.setNamedItem( objNewAttribute );
// Denne linje lægger din nye node ind i dokumentet, som den sidste node
// i hierarkiet
objRoot.appendChild( objNewNode );


hvis du vil have appendet den nye node et andet sted i din xml, så er du nødt til at selecte denne node, og appende til denne:

    var objXMLDoc = new ActiveXObject('Msxml2.DOMDocument');
objXMLDoc.loadXML( "<root><node><endnuEnNode/></node></root>" );
var objNewNode = objXMLDoc.createElement( "varID" );
var objNewAttribute = objXMLDoc.createAttribute( "produktID" );
var objNewNodeAttributes = objNewNode.attributes;
objNewNodeAttributes.setNamedItem( objNewAttribute );
var objAppendNode = objXMLDoc.selectSingleNode( "/root/node/endnuEnNode" );
if( objAppendNode )
{
    objAppendNode.appendChild( objNewNode );
}

/nute
Avatar billede kimlarsen1978 Nybegynder
02. marts 2004 - 17:39 #5
Skal jeg gøre det du skriver før eller efter jeg skriver:
xmlDoc.loadXML(unescape(Xml));
?
Avatar billede nute Nybegynder
02. marts 2004 - 17:40 #6
kig lidt i min kode, så ser du at jeg også gør brug af 'loadXML'

;o]
Avatar billede kimlarsen1978 Nybegynder
02. marts 2004 - 17:42 #7
Jeg har jo et XML dokument i

objXMLDoc.loadXML(unescape(Xml));

Så det er vel ikke nødvendigt at lave en <root/> jeg skal bare have noden varID ind under min nuværende rootnode som hedder <start>

eller taler vi i øst og vest?
Avatar billede kimlarsen1978 Nybegynder
02. marts 2004 - 17:43 #8
Så skal jeg bare bytte din
loadXML
ud med den jeg selv her, eller?
Avatar billede nute Nybegynder
02. marts 2004 - 17:47 #9
jeg har jo ikke din xml, så for at vise dig hvordan det skal laves, og for at vise at det fungere, så er jeg jo nødt til at have en XML dokument ... derfor har jeg lavet en dummy XML i formatet <root><node/></root>.

loadXML metoden laster jo bare XML fra en string. hvis du vil have *din* xml ind, så skal du jo bare skifte min indlæsning af XML med din XML ...

/nute
Avatar billede kimlarsen1978 Nybegynder
02. marts 2004 - 17:50 #10
Ok
Det har jeg så nu :)
Men jeg skulle jo have værdien fra min form ned i den her attribut, og senere bruge den igen - er det også noget du kan hjælpe med? (mest det første med også gerne det sidste :))
Avatar billede nute Nybegynder
02. marts 2004 - 17:53 #11
hvordan skal den sættes ind ? skal du trykke på en knap for at sætte værdien ind ? får du værdien fra querystring eller hvad? og hvad mener du med 'senere bruge den igen' ?
Avatar billede kimlarsen1978 Nybegynder
02. marts 2004 - 17:58 #12
Jeg kører på klienten her er et kodeudsnit:
------
function xml(){
  var vaerdi = document.soeg.produkt.value;

  var objXMLDoc = new ActiveXObject('Msxml2.DOMDocument');
  var objXSLDoc = new ActiveXObject('Msxml2.DOMDocument');
  var serverXml = '<%=xml%>';
  objXMLDoc.loadXML(unescape(Xml));

  var objRoot = objXMLDoc.documentElement;   
  var objNewNode = objXMLDoc.createElement( "varID" );
  var objNewAttribute = objXMLDoc.createAttribute( "produktID" );
  var objNewNodeAttributes = objNewNode.attributes;

  objNewNodeAttributes.setNamedItem( objNewAttribute );
  objRoot.appendChild( objNewNode );
   
  objXSLDoc.load('output.xsl');

  osv.
---------------
i output.xsl skal jeg så bruge den her:
---------------------
<xsl:template match='start'>
  <xsl:apply-templates select='vare[@Produkt_id=MIN NYE NODE]'/>
</xsl:template>
---------------------
Avatar billede kimlarsen1978 Nybegynder
02. marts 2004 - 17:59 #13
Værdien til produktId er altså denne:
--------
var vaerdi = document.soeg.produkt.value;
--------
Avatar billede nute Nybegynder
02. marts 2004 - 18:11 #14
hmm ... det vil jo ikke fungere ...

du opretter 'varID', men hiver ud 'vare' og du oprettet 'produktID', men hiver ud 'Produkt_id' ... anyway... her er så koden der stemmer overens med din XSL

var objXMLDoc = new ActiveXObject('Msxml2.DOMDocument');
var objXSLDoc = new ActiveXObject('Msxml2.DOMDocument');
var serverXml = '<%=xml%>';
objXMLDoc.loadXML(unescape(Xml));
var vaerdi  = document.soeg.produkt.value;
var objRoot = objXMLDoc.documentElement;   
var objNewNode = objXMLDoc.createElement( "vare" );
var objNewAttribute = objXMLDoc.createAttribute( "Produkt_id" );
objNewAttribute.value = vaerdi;
var objNewNodeAttributes = objNewNode.attributes;
objNewNodeAttributes.setNamedItem( objNewAttribute );
objRoot.appendChild( objNewNode );
   
objXSLDoc.load('output.xsl');

/nute
Avatar billede kimlarsen1978 Nybegynder
02. marts 2004 - 18:14 #15
Ja ok - det var min skrive fejl - sorry :)
Men hvordan er syntaxen i for at bruge noden som jeg gerne vil her?:
--------
<xsl:template match='start'>
  <xsl:apply-templates select='vare[@Produkt_id=MIN NYE NODE]'/>
</xsl:template>
----------
Avatar billede kimlarsen1978 Nybegynder
02. marts 2004 - 18:24 #16
Kender du til steder på nettet hvor der er nogle lær XML guides?
Jeg kunne godt bruge nogle artikler som gennemgår hvordan man gør det mest basale som nu fx. det her med at tildele nodes/variabler og efterfølgende bruge dem.

Jeg er meget grøn indenfor XML og kunne derfor godt bruge noget basal grundviden
Avatar billede nute Nybegynder
02. marts 2004 - 18:37 #17
den eneste måde du kan få fat i den nye node, er at sende ind produkt id som parameter til din xsl. Jeg er nødt til at smutte, men smider hele min testapp med, så du kan få se noget kode. jeg håber du kan finde ud af det.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>
<head>
    <title>Untitled</title>
    <script language="JavaScript" type="text/javascript">
    <!--
    function insertValue()
    {
       
        /*var objXMLDoc = new ActiveXObject('Msxml2.DOMDocument');
        objXMLDoc.loadXML( "<root><node><endnuEnNode/></node></root>" );
        var objRoot = objXMLDoc.documentElement;
        var objNewNode = objXMLDoc.createElement( "vare" );
        var objNewAttribute = objXMLDoc.createAttribute( "Produkt_id" );
        objNewAttribute.value = strValue;
        var objNewNodeAttributes = objNewNode.attributes;
        objNewNodeAttributes.setNamedItem( objNewAttribute );
        var objAppendNode = objXMLDoc.selectSingleNode( "/root/node/endnuEnNode" );
        objRoot.appendChild( objNewNode );
        document.getElementById( "txtarea" ).value = objRoot.xml;
        */
        var vaerdi = document.soeg.produkt.value;

        var objXSLDoc = new ActiveXObject("Msxml2.XSLTemplate");
        var objXMLDoc = new ActiveXObject('Msxml2.DOMDocument');
        var objFTDom = new ActiveXObject('Msxml2.FreeThreadedDOMDocument');
        objXMLDoc.loadXML( "<root><node><endnuEnNode/></node></root>" );
        var vaerdi  = document.soeg.produkt.value;
        var objRoot = objXMLDoc.documentElement;   
        var objNewNode = objXMLDoc.createElement( "vare" );
        objNewNode.text = "test";
        var objNewAttribute = objXMLDoc.createAttribute( "Produkt_id" );
        objNewAttribute.value = vaerdi;
        var objNewNodeAttributes = objNewNode.attributes;
        objNewNodeAttributes.setNamedItem( objNewAttribute );
        objRoot.appendChild( objNewNode );
       
        objFTDom.loadXML( document.getElementById( "txtxsl").value );
        objXSLDoc.stylesheet = objFTDom;
        var xslProc = objXSLDoc.createProcessor();
        xslProc.addParameter( "produktID", vaerdi );
        xslProc.input = objXMLDoc;
        xslProc.transform();
        document.getElementById( "txtresult" ).value = xslProc.output;

    }
    //-->
    </script>
</head>
<body>
<form id="soeg" name="soeg">
<input type="text" id="produkt" name="produkt"><br>
<input type="button" value="sæt ind værdi" onclick="insertValue();"><br>
<textarea id="txtarea" cols="50" rows="15"></textarea>
<textarea id="txtxsl"><?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:param name="produktID">asdf</xsl:param>
<xsl:template match="/">
    <xsl:value-of select="/root/vare[@Produkt_id= $produktID]"/>
</xsl:template>
</xsl:stylesheet></textarea>
<textarea id="txtresult" cols="50" rows="15"></textarea>
</form>
</body>
</html>

/nute
Avatar billede nute Nybegynder
03. marts 2004 - 09:47 #18
kunne du bruge dette til noget ?

hvis du er "grøn" i xml/xsl, så er der nogle gode tutorials på http://www.w3schools.com/ (kig i menuen til venstre). ellers er www.topxml.com også et ok site.

men ... min erfaring er faktisk at, at læse i dokumentationen giver et godt overblik. jeg har lært det meste af det jeg kan, via at have nogle specifikke problemstillinger, måske surfe lidt på nettet etter løsninger, men mest af alt, så har jeg læst "dokumentationen" til xsl og xpath og en hel masse prøve og fejling :o]

(hvis du ikke synes det bliver altfor teknisk, så kan du kigge direkte i specifikationen for xsl/xpath:
http://www.w3.org/TR/xslt
http://www.w3.org/TR/xpath )

xsl:
http://www.w3schools.com/xsl/xsl_w3celementref.asp
http://www.w3schools.com/xsl/xsl_functions.asp

ellers kan du skrive ud en lille smart side med alle nødvendige funktioner og elementer herfra (quick-reference) så du kan have alt lige for hånden:
http://www.mulberrytech.com/quickref/index.html

xpath:
http://www.w3schools.com/xpath/default.asp

håber det giver noget hjælp :]

/nute
Avatar billede kimlarsen1978 Nybegynder
03. marts 2004 - 18:23 #19
Ja det er helt fint :)
Smider du et svar?
Avatar billede nute Nybegynder
03. marts 2004 - 18:47 #20
fino :o]

svar
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