Solved

XML and XSL

Posted on 2002-07-30
8
386 Views
Last Modified: 2013-11-19
Dear experts,

I'm developing a XML web tool to allow the user to change, add, or delete xml elements and attributes. The following test.xsl can only show the information of one element "command" ( mytree.xml ). It doesn't work if there are more elements of "command" ( mytree2.xml ). I also want to know how to display the details of the element and its' attriubites into the form input fields in the right frame when the user clicks on any node on the left frame. Please advice me with code. Thanks!

****************
test.xsl
****************
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!--containers-->
    <xsl:template match="*[*]">
    <xsl:variable name="id" select="command" />
    <div>
        <img src="images/collapse.gif" onclick="toggleMenu('{$id}');" name="img{$id}" style="cursor:hand;"/>
        <span class="item">
              <xsl:value-of select="name(.)"/>:  [<xsl:value-of select="@name" />]
      </span>
      <div style="display:none;" id="container{$id}" class="container">
              <xsl:apply-templates select="*" />
      </div>
    </div>
</xsl:template>

<!--leaf objects-->
<xsl:template match="*[not(*)]">
     <div>
        <img src="images/leaf.gif"/>
        <span class="item">
            <xsl:value-of select="name(..)"/>::<xsl:value-of select="name(.)"/>: [<xsl:value-of select="@name"/>]
        </span>
     </div>
   </xsl:template>  
</xsl:stylesheet>
0
Comment
Question by:Amy01
  • 5
  • 3
8 Comments
 

Author Comment

by:Amy01
ID: 7188779
**************
treeTest.html
**************
<html>
   <head>
       <title>Tree Menu Through MSIE Transformation</title>
       <script language="javascript">
     <!--
          var imgExpand = new Image();
          imgExpand.src = "images/expand.gif";
          var imgCollapse = new Image();
          imgCollapse.src = "images/collapse.gif";

          function toggleMenu(szID) {
                var szImage = "img" + szID;
                var img = document.images ? document.images[szImage]  : null;
                var szContainer = "container" + szID;
                var container = document.all ? document.all[szContainer] : document.getElementById ?

document.getElementById(szContainer) : null;
                if (! img || ! container) return;
                     if (container.style.display == "none") {
                            img.src = imgExpand.src;
                            container.style.display = "block";
                     } else {
                            img.src = imgCollapse.src;
                            container.style.display = "none";
                     }
          }
         
          window.onload = init;
          function init() {
               // use the  += operator which appends
               // using the = replaces the innerHTML and removes the reference to the data islands
               // that would generate errors
                 document.body.innerHTML += oXML.transformNode(oXSLT);
          }
     //-->
     </script>
     <style type="text/css">
     <!--
          body {font-family:Verdana;letter-spacing:0.3mm;font-variant:small-caps;font-size:8pt;background:#fffffe;}
          a {text-decoration:none;color:#4682b4;}
          a:hover {text-decoration:underline;color:#800000;}
          div.root, div.container, div.item {padding-left:10px;}
     //-->
     </style>
   </head>
   <body>
     <XML id="oXML" src="mytree.xml"></XML>
     <XML id="oXSLT" src="test.xsl"></XML>
   </body>
</html>
0
 

Author Comment

by:Amy01
ID: 7188780
*******************
modifyXML.html
*******************
<HTML>
    <HEAD>
     <TITLE>Modify XML Document</TITLE>
     </HEAD>
     <BODY>
        <IFRAME ALIGN=LEFT FRAMEBORDER=1 HEIGHT=300  WIDTH=75% MARGINHEIGHT=0 MARGINWIDTH=0 NAME=XMLTree SCROLLING=yes SRC="./folderTreeFrame.jsp">
      </BODY>
</HTML>



********************
XMLTreeFrame.html
********************
<html>
<head>
<title>XMLTree</title>
</head>

<FRAMESET cols="200,*">
  <FRAME src="./treeTest.html" name="treeframe" >
  <FRAME SRC="./folderTreeBlankFrame.jsp" name="basefrm">
</FRAMESET>

</HTML>


**************
mytree.xml
**************
<?xml version="1.0"?>
  <project name="XML Generator Application">
     <command name="View">
     <codeBase>xmlgenerator.commands.View</codeBase>
     <target name="view">/viewXMLDocument.jsp</target>
        <target name="modify">/modifyXMLDocument.jsp</target>
     <requestparameter get="true" set="false" name="userFile">java.lang.String</requestparameter>
     <requestparameter get="true" set="false" name="action">java.lang.String</requestparameter>
     <requestparameter get="true" set="false" name="xmlDocument">java.lang.String</requestparameter>
     <requestparameter get="true" set="true" name="xmlFile">java.lang.String</requestparameter>
      </command>
</project>

****************
mytree2.html
****************
<?xml version="1.0"?>
  <project name="XML Generator Application">
     <command name="View">
     <codeBase>xmlgenerator.commands.View</codeBase>
     <target name="view">/viewXMLDocument.jsp</target>
        <target name="modify">/modifyXMLDocument.jsp</target>
     <requestparameter get="true" set="false" name="userFile">java.lang.String</requestparameter>
     <requestparameter get="true" set="false" name="action">java.lang.String</requestparameter>
     <requestparameter get="true" set="false" name="xmlDocument">java.lang.String</requestparameter>
     <requestparameter get="true" set="true" name="xmlFile">java.lang.String</requestparameter>
     <requestparameter get="false" set="true" name="msg">java.lang.String</requestparameter>
     <requestparameter get="false" set="true" name="viewList">java.util.Vector</requestparameter>
        <requestparameter get="false" set="true" name="nodes">java.util.Collection</requestparameter>
      </command>
      <command name="Modify">
     <codeBase>xmlgenerator.commands.View</codeBase>
     <target name="view">/viewXMLDocument.jsp</target>
        <target name="modify">/modifyXMLDocument.jsp</target>
     <requestparameter get="true" set="false" name="userFile">java.lang.String</requestparameter>
     <requestparameter get="true" set="false" name="action">java.lang.String</requestparameter>
     <requestparameter get="true" set="false" name="xmlDocument">java.lang.String</requestparameter>
     <sessionattribute get="true" set="true" name="id">java.lang.String</requestparameter>
      </command>
</project>
0
 
LVL 27

Accepted Solution

by:
BigRat earned 70 total points
ID: 7190163
Why the "catch-all" top level template :-

   <!--containers-->
   <xsl:template match="*[*]">


It requires "command" to be a child node, so why not explicitly match command?
0
 

Author Comment

by:Amy01
ID: 7190637
It also need catch the element "project"
<?xml version="1.0"?>
 <project name="XML Generator Application">
    <command name="View">
    <codeBase>xmlgenerator.commands.View</codeBase>
    <target name="view">/viewXMLDocument.jsp</target>
       <target name="modify">/modifyXMLDocument.jsp</target>
    <requestparameter get="true" set="false" name="userFile">java.lang.String</requestparameter>
    <requestparameter get="true" set="false" name="action">java.lang.String</requestparameter>
    <requestparameter get="true" set="false" name="xmlDocument">java.lang.String</requestparameter>
    <requestparameter get="true" set="true" name="xmlFile">java.lang.String</requestparameter>
    <requestparameter get="false" set="true" name="msg">java.lang.String</requestparameter>
    <requestparameter get="false" set="true" name="viewList">java.util.Vector</requestparameter>
       <requestparameter get="false" set="true" name="nodes">java.util.Collection</requestparameter>
     </command>
     <command name="Modify">
    <codeBase>xmlgenerator.commands.View</codeBase>
    <target name="view">/viewXMLDocument.jsp</target>
       <target name="modify">/modifyXMLDocument.jsp</target>
    <requestparameter get="true" set="false" name="userFile">java.lang.String</requestparameter>
    <requestparameter get="true" set="false" name="action">java.lang.String</requestparameter>
    <requestparameter get="true" set="false" name="xmlDocument">java.lang.String</requestparameter>
    <sessionattribute get="true" set="true" name="id">java.lang.String</requestparameter>
     </command>
</project>
0
What Should I Do With This Threat Intelligence?

Are you wondering if you actually need threat intelligence? The answer is yes. We explain the basics for creating useful threat intelligence.

 
LVL 27

Expert Comment

by:BigRat
ID: 7190734
Yes, I appreciate that, but can you tell me why the "catch alls" or if you don't understand me, why the *[*]? What is it meant to match exactly? (Rat is probably not in full form today!)
0
 

Author Comment

by:Amy01
ID: 7201578
*[*] matches any element on the tree except leaf elements.
0
 

Author Comment

by:Amy01
ID: 7210283
Here is my solution:
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
       <!--containers-->
     
      <xsl:template match="*[*]">
      <xsl:variable name="id" select="*" />
      <div>
           <img src="images/collapse.gif" onclick="toggleMenu('{$id}');" name="img{$id}" style="cursor:hand;"/>
             <span class="item">
                  <xsl:value-of select="name(.)"/>:  [<xsl:value-of select="@name" />]
             </span>
             <div style="display:none;" id="container{$id}" class="container">
                  <xsl:apply-templates select="*" />
             </div>  
        </div>  
     </xsl:template>

     <!--leaf objects-->
     <xsl:template match="*[not(*)]">
     <xsl:variable name="id" />
     <div>
             <img src="images/leaf.gif"/>
             <span class="item">
                   <xsl:value-of select="name(..)"/>::<xsl:value-of select="name(.)"/>: [<xsl:value-of select="@name" />]
             </span>
     </div>
    </xsl:template>
   
</xsl:stylesheet>
0
 
LVL 27

Expert Comment

by:BigRat
ID: 7213967
Interesting...

In the leaf template the  <xsl:variable name="id" />
is unused and redundant.

I must admit I do like the *[not(*)] construct! It appeals to Rat's failble for the obscure!
0

Featured Post

IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

Join & Write a Comment

Preface This is the third article about the EE Collaborative Login Project. A Better Website Login System (http://www.experts-exchange.com/A_2902.html) introduces the Login System and shows how to implement a login page. The EE Collaborative Logi…
Have you tried to learn about Unicode, UTF-8, and multibyte text encoding and all the articles are just too "academic" or too technical? This article aims to make the whole topic easy for just about anyone to understand.
Viewers will learn about arithmetic and Boolean expressions in Java and the logical operators used to create Boolean expressions. We will cover the symbols used for arithmetic expressions and define each logical operator and how to use them in Boole…
Viewers will learn about the regular for loop in Java and how to use it. Definition: Break the for loop down into 3 parts: Syntax when using for loops: Example using a for loop:

706 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

16 Experts available now in Live!

Get 1:1 Help Now