function convert(fm, xmldoc) { var fname = fm.fname.value, output = fm.output, rate = fm.rate.value; output.value = ""; var doc = parse(fname,xmldoc), top = doc.documentElement; walkNode(top,doc,rate); // doc¿¡¼ ¼öÁ¤ addHeader(doc, rate); // new function output.value = doc.xml; // ȸéÃâ·Â } function parse(uri,xmldoc) // same function addHeader(doc,rate) { var comm = doc.createComment("Àû¿ë ȯÀ² = "+rate), style = doc.createProcessingInstruction( "xml-stylesheet", "href='prices.css' type='text/css'"), top = doc.documentElement; doc.insertBefore(comm,top); doc.insertBefore(style,comm); } |
function walkNode(node,doc,rate) |
<HTML> <FORM ID=¡°controls¡±> Ç°¸í<INPUT ¡¦ ¡°name¡±> °¡°Ý<INPUT ¡¦ ¡°price¡±> ÈÆó<Select ¡¦ ¡°currency¡±> <... ¡°ÀÛ¼ºÇϱ⡱ ¡°create(controls,xml)¡±> <... ¡°Áö¿ì±â¡± ¡°resetAll(controls,xml)¡±> <Textarea ¡°output¡±> <xml id=¡°xml¡±> </xml> |
function create(fm,doc) { var name = fm.name.value, price = fm.price.value, currency = fm.currency.value, output = fm.output; var top = getTopLevel(doc); //new node var elProduct = doc.createElement("product"), elName = doc.createElement("name"); elPrice = doc.createElement("price"); elPrice.setAttribute("currency",currency); var text = doc.createTextNode(name); elName.appendChild(text); text = doc.createTextNode(price); elPrice.appendChild(text); elProduct.appendChild(elName); elProduct.appendChild(elPrice); top.appendChild(elProduct); output.value = ""; output.value = doc.xml; } |
// ÃÖ»óÀ§ ¿¤¸®¸ÕÆ® »ý¼º function getTopLevel(doc) { var top = doc.documentElement; if (top == null) { top = doc.createElement("products"); doc.appendChild(top); } return top; } function resetAll(fm,doc) { var top = doc.documentElement; doc.removeChild(top); var output = fm.output; output.value = ""; } |
<FORM ID=¡°controls¡±> Ç°¸í<INPUT ¡¦ ¡°name¡±> °¡°Ý(´Þ·¯)< ¡¦ ¡°dollar¡±> °¡°Ý(À¯·Î)< ¡¦ ¡°euro¡±> <Select ¡°plist¡±> <¡°Ãß°¡¡± ¡°addProduct(controls)¡±> <¡°»èÁ¦¡± ¡°deleteProduct(controls)¡±> <¡°XMLº¯È¯¡± ¡°exportProduct(controls)¡±> <¡°Áö¿ì±â¡± ¡°output.value=''¡±> <Textarea ¡°output¡±> |
var products = new Array(); // JavaScript °´Ã¼ function addProduct(fm) // 1) "Ãß°¡" ¹öÆ° { var name = fm.name.value, dollars = fm.dollar.value, euros = fm.euro.value, pList = fm.plist; // ½Å±Ô°´Ã¼ »ý¼º var dPrice = new Price(dollars, "usd"), ePrice = new Price(euros, "eur"), prices = new Array(dPrice, ePrice), product = new Product(name, prices); var pos = products.length; // index 0ºÎÅÍ ½ÃÀÛ products[pos] = product; // ½Å±Ô³ëµå »ðÀÔ var option = new Option(name,pos); //JS °´Ã¼ pList.options[pList.length] = option; // JS °´Ã¼¼Ó¼º »ý¼º : // <select> ... <option>...</option> </select> } function deleteProduct(fm) // 2) "»èÁ¦" ¹öÆ° { var pList = fm.plist, pos = pList.selectedIndex; // JS °´Ã¼¼Ó¼º if (pos != -1) { var product = pList.options[pos].value; pList.options[pos] = null; // List¿¡¼ »èÁ¦ products[product] = null; // ¹è¿¿¡¼ »èÁ¦ } } function exportProduct(fm) // 3) "º¯È¯" ¹öÆ° { fm.output.value = makeXML(); } function makeXML() { var xmlcode = ""; var i; for (i=0; i<products.length; i++) if (products[i] != null) xmlcode += products[i].toXML(); // <product> ¡¦ </product> return element("products","",xmlcode); } // <products> <product ¡¦> ¡¦ </products> |
function Price(amount,currency) //
°´Ã¼»ý¼º { this.amount = amount; this.currency = currency; this.toXML = price_toXML; } function price_toXML() { return element("price", "currency=\"" + this.currency + "\"", escapeXML(this.amount)); } // <price currency="xxx"> amount </price> function Product(name,prices) // °´Ã¼»ý¼º { this.name = name; this.prices = prices; this.toXML = product_toXML; } function product_toXML() { var i, result = element( "name","",escapeXML(this.name)); // <name>¡¦</name> for (i=0; i < this.prices.length; i++) result += this.prices[i].toXML(); // <price¡¦ >...</price> return element("product","",result); } //<product> <name>¡¦ <price¡¦ > </product> function escapeXML(string) { var result = "", i, c; for (i=0; i<string.length; i++) { c = string.charAt(i); if (c == '<') result += "<"; else if (c == '&') result += "&"; else result += c; } return result; } // element·Î ¸¸µé±â function element(name,attr,content) { var result = "<" + name; if (attr != "") result += " " + attr; result += ">" + content + "</" + name + ">\r"; return result; } // <name attr> content </name> |
¸®½ºÆ® 9.12 [p.316] (ex9-4.html)
<!ELEMENT products (product+)>
<!ELEMENT product (name, price+)>
<!ATTLIST price currency ¡¦><!ELEMENT price-list (line+)>
<!ATTLIST line name ¡¦>
<!ATTLIST line price ¡¦>
<!ATTLIST line currency ¡¦>
<FORM ID=¡°controls¡±> Ç°¸í<INPUT ¡¦ ¡°name¡±> °¡°Ý(´Þ·¯) <¡¦ ¡°dollar¡±> °¡°Ý(À¯·Î) <¡¦ ¡°euro¡±> <Select ¡°plist¡±> <¡°Ãß°¡¡± ¡°addProduct(controls)¡±> <¡°»èÁ¦¡± ¡°deleteProduct(controls)¡±> <¡°XMLº¯È¯¡± ¡°exportProduct(controls,xml,xslt)¡±> <Select ¡°format¡±> <¡°Áö¿ì±â¡± ¡°¡¦¡±> <Textarea ¡°output¡±> <xml id=¡°xml¡±> </xml> <xml id=¡°xslt¡± src=¡°convert.xsl¡±> </xml> |
var products = new Array(); // 1¹ø° ¹öÆ° "Ãß°¡" function addProduct(fm) // price °´Ã¼ function Price(amount,currency) function price_toXML() // product °´Ã¼ function Product(name,prices) function product_toXML() // element·Î ¸¸µé±â function element(name,attr,content) function escapeXML(string) // 2¹ø° ¹öÆ° "»èÁ¦" function deleteProduct(fm) |
// 3¹ø° ¹öÆ° "º¯È¯" *** function exportProduct(fm,xml,xslt) { var selected = fm.format.selectedIndex, format = fm.format.options[selected].value; if (format == "default") fm.output.value = makeXML(); else { var xmlDoc = makeXML(); xml.async = false; xml.loadXML(xmlDoc); // Æļ¿¡ XML¹®¼ Àü¼Û fm.output.value = xml.transformNode(xslt.XMLDocument); } } function makeXML() |
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <xsl:apply-templates/> </xsl:template> <xsl:template match="products"> <price-list> <xsl:apply-templates/> </price-list> </xsl:template> <xsl:template match="product"> <xsl:apply-templates/> </xsl:template> |
<xsl:template match="price"> <line> <xsl:attribute name="name"> <xsl:value-of select="../name"/> </xsl:attribute> <xsl:attribute name="price"> <xsl:value-of select="."/> </xsl:attribute> <xsl:attribute name="currency"> <xsl:value-of select="@currency"/> </xsl:attribute> </line> </xsl:template> </xsl:stylesheet> |