Solved

XML and XSL

Posted on 2002-07-30
8
406 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 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
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 

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
 
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

Tutorials alone can't teach real engineering

So we built better training tools.

-Hands-on Labs
-Instructor Mentoring
-Scenario-Based Tests
-Dedicated Cloud Servers

All at your fingertips. What are you waiting for?

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Preface This article introduces an authentication and authorization system for a website.  It is understood by the author and the project contributors that there is no such thing as a "one size fits all" system.  That being said, there is a certa…
JavaScript has plenty of pieces of code people often just copy/paste from somewhere but never quite fully understand. Self-Executing functions are just one good example that I'll try to demystify here.
The viewer will learn how to dynamically set the form action using jQuery.
The viewer will receive an overview of the basics of CSS showing inline styles. In the head tags set up your style tags: (CODE) Reference the nav tag and set your properties.: (CODE) Set the reference for the UL element and styles for it to ensu…
Suggested Courses

630 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