Á¦9Àå. XML¹®¼­ ÀÛ¼ºÇϱâ

DOMÀ¸·Î ¹®¼­ ¼öÁ¤ÇÏ±â   

¸®½ºÆ® 9.2 p.287 (ex9-1.html),
¸®½ºÆ® 9.3 p.288 (convert9.js)
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)
{                                                // doc¿¡¼­ ¼öÁ¤
  if(node.nodeType == 1) {
    if(node.nodeName == "product")
       walkProduct(node,doc,rate);
    else  {
       var children, i;
       children = node.childNodes;
       for (i=0; i<children.length; i++)
          walkNode(children.item(i),doc,rate);
    }
  }
}

function walkProduct(node,doc,rate)
{                                                   // doc¿¡¼­ ¼öÁ¤
  if(node.nodeType == 1 && 
                node.nodeName == "product")
  {
    var name, price, children, i;
    children = node.childNodes;
    for (i=0; i<children.length; i++)
    {
      var child = children.item(i);
      if(child.nodeType == 1)
        if(child.nodeName == "price")
          price = child; // ÇöÀç³ëµå (child)
    }
    var elmt = doc.createElement("price"), //½Å±Ô
    text = doc.createTextNode(getText(price)*rate);
    elmt.setAttribute("currency","eur");
    elmt.appendChild(text);
    node.appendChild(elmt); // ¹Ù·Î À§ÀÇ ³ëµå
    price.setAttribute("currency","usd"); //ÇöÀç³ëµå
  }
}

function getText(node) // same

DOMÀ¸·Î »õ·Î¿î ¹®¼­ ÀÛ¼ºÇÏ±â  

¸®½ºÆ® 9.4 p.296 (ex9-2.html)
<HTML> <FORM ID=¡°controls¡±>
   Ç°¸í<INPUT ¡¦ ¡°name¡±> °¡°Ý<INPUT ¡¦ ¡°price¡±> È­Æó<Select ¡¦ ¡°currency¡±>
  <... ¡°ÀÛ¼ºÇϱ⡱ ¡°create(controls,xml)¡±> <... ¡°Áö¿ì±â¡± ¡°resetAll(controls,xml)¡±>
  <Textarea ¡°output¡±>
  <xml id=¡°xml¡±> </xml>

¸®½ºÆ® 9.5 p.297 (create.js )
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 = "";
}

DOM¾øÀÌ ¹®¼­ »ý¼ºÇϱâ

¸®½ºÆ® 9.6 [p.302] (ex9-3.html)
<FORM ID=¡°controls¡±>
  Ç°¸í<INPUT ¡¦ ¡°name¡±>  °¡°Ý(´Þ·¯)< ¡¦ ¡°dollar¡±>  °¡°Ý(À¯·Î)< ¡¦ ¡°euro¡±>  <Select ¡°plist¡±>
  <¡°Ãß°¡¡± ¡°addProduct(controls)¡±> <¡°»èÁ¦¡± ¡°deleteProduct(controls)¡±>
  <¡°XMLº¯È¯¡± ¡°exportProduct(controls)¡±> <¡°Áö¿ì±â¡± ¡°output.value=''¡±>
  <Textarea ¡°output¡±>

¸®½ºÆ® 9.7 [p.303] (
create.js)
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 += "&lt";
     else if (c == '&') result += "&amp";
     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>

XML ¹®¼­ ÀÛ¾÷ (¼­¹ö·Î Àü´ÞÇϱâ) : »ý·«

À¶Å뼺 ÀÖ°Ô ÀÛ¼ºÇϱâ : XSLT·Î ¿©·¯ DTD Áö¿ø

<!ELEMENT products (product+)>
<!ELEMENT product (name, price+)>
<!ATTLIST price currency ¡¦>
<!ELEMENT price-list (line+)>
<!ATTLIST line name ¡¦>
<!ATTLIST line price ¡¦>
<!ATTLIST line currency ¡¦>
¸®½ºÆ® 9.12 [p.316] (ex9-4.html)
<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>

¸®½ºÆ® 9.13 [p.317] (create3.js)
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()

¸®½ºÆ® 9.14 [p.322] (
convert.xsl )
<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>