xsl-list
[Top] [All Lists]

Re: [xsl] How to make tree menu from flat XML

2006-07-23 08:29:47
Thanks Mukul,
The levels are only 3 yes. But how to use heirarchy
XML made by template. This is what I trying:

<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
<xsl:output method="xml" indent="yes"/>
        
<xsl:template match="/records">
  <records>
    <xsl:for-each select="record[parentkeynum = 0]">
      <record>
        <xsl:variable name="key1" select="keynum" />
        <xsl:copy-of select="*" />
        <xsl:for-each select="../record[parentkeynum =
$key1]">
          <record>
            <xsl:variable name="key2" select="keynum"
/>
            <xsl:copy-of select="*" />
            <xsl:for-each
select="../record[parentkeynum = $key2]">
              <record>
                <xsl:copy-of select="*" />
              </record>
            </xsl:for-each>
          </record>
        </xsl:for-each>
      </record>
    </xsl:for-each>
  </records>
<xsl:call-template name="dve">
</xsl:call-template>

</xsl:template>

<xsl:template name="dve" match="/">
 <xsl:for-each select="//records/record">
  <xsl:call-template name="SubMenu">
   <xsl:with-param name="strCSS">Parent
IsVisible</xsl:with-param>
  </xsl:call-template>
 </xsl:for-each>
</xsl:template>

<xsl:template name="SubMenu">
 <xsl:param name="strCSS" />
 

 
 <div class="{$strCSS}">
  <xsl:choose>
   <xsl:when test="count(record) &gt; 0">
    <!-- Element has children, it can be expanded -->
    <input type="hidden" id="hidIsExpanded" value="0"
/>
    <label id="lblExpand" class="Expander"
onclick="ExpanderClicked()">+&#160;</label>
   </xsl:when>
   <xsl:otherwise>
    <label class="Expander">&#160;&#160;</label>
   </xsl:otherwise>
  </xsl:choose>
  
  <a><xsl:value-of select="keyname" /></a>
  <xsl:for-each select="record">
   <xsl:call-template name="SubMenu">
    <xsl:with-param
name="strCSS">NotVisible</xsl:with-param>
   </xsl:call-template>
  </xsl:for-each>
 </div>
</xsl:template>

</xsl:stylesheet>



and than I use this ASP

<%@ Language=VBScript %>
<% option explicit %>
<HTML>
<HEAD>
<link type="text/css" rel="stylesheet"
href="alerts.css" />
</HEAD>
<BODY>
<b>Alerts</b>
<%
        dim xmlMenu
        dim xslMenu
        
        'Get the source XML
        set xmlMenu = server.CreateObject("Microsoft.XMLDOM")
        xmlMenu.async = false
        xmlMenu.load server.MapPath("probe.xml")
        
        'Get the XSLT to transform the XML
        set xslMenu = server.CreateObject("Microsoft.XMLDOM")
        xslMenu.async = false
        xslMenu.load server.MapPath("probe.xsl")
        
        'Transform the source XML using XSLT
        Response.Write xmlMenu.transformNode(xslMenu)
        
        set xmlMenu = nothing
        set xslMenu = nothing
%>

<script language="jscript">
function ExpanderClicked()
{
        //Get the element that was clicked
        var ctlExpander = event.srcElement;
        var ctlSelectedEntry = ctlExpander.parentElement;
        //Get all the DIV elements that are direct
descendants
        var colChild = ctlSelectedEntry.children.tags("DIV");
        if(colChild.length > 0)
        {
                var strCSS;
                //Get the hidden element that indicates whether or
not entry is expanded
                var ctlHidden =
ctlSelectedEntry.all("hidIsExpanded");
                
                if(ctlHidden.value == "1")
                {
                        //Entry was expanded and is being contracted
                        ctlExpander.innerHTML = "+&nbsp;";
                        ctlHidden.value = "0";
                        strCSS = "NotVisible";
                }
                else
                {
                        //Entry is being expanded
                        ctlExpander.innerHTML = "-&nbsp;";
                        ctlHidden.value = "1";
                        strCSS = "IsVisible";
                }
                //Show all the DIV elements that are direct children
                for(var intCounter = 0; intCounter <
colChild.length; intCounter++)
                {
                        colChild[intCounter].className = strCSS;
                }
        }
}
</script>

</BODY>
</HTML>

But it dont working. When I trying with other XML who
is heirarchy by default it works. So my question is
how use the heirarchy XML immediantly after template
who makes it?


--- Mukul Gandhi <gandhi(_dot_)mukul(_at_)gmail(_dot_)com> wrote:

If the levels would be limited to 3 only (or can
there be any number
of levels?), then the following stylesheet would
work:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>

<xsl:output method="xml" indent="yes"/>
      
<xsl:template match="/records">
  <records>
    <xsl:for-each select="record[parentkeynum = 0]">
      <record>
        <xsl:variable name="key1" select="keynum" />
        <xsl:copy-of select="*" />
        <xsl:for-each select="../record[parentkeynum
= $key1]">
          <record>
            <xsl:variable name="key2"
select="keynum" />
            <xsl:copy-of select="*" />
            <xsl:for-each
select="../record[parentkeynum = $key2]">
              <record>
                <xsl:copy-of select="*" />
              </record>
            </xsl:for-each>
          </record>
        </xsl:for-each>
      </record>
    </xsl:for-each>
  </records>
</xsl:template>
      
</xsl:stylesheet>

Regards,
Mukul

http://gandhimukul.tripod.com

On 7/23/06, Radoslav Kolarov <roonex(_at_)yahoo(_dot_)com>
wrote:
Mukul thanks for the answer. The problem is how to
turn tree structured information into dynamic tree
menu. I found some js scripts but I can use them
only
if XML is structured heirarchy. So I have to
transform
XML to this:

<?xml version="1.0" ?>
- <records>

- <record>
 <keynum>-100000</keynum>
 <keyname>FINANCIAL ALERTS (5)</keyname>
 <parentkeynum>0</parentkeynum>
 <rowcnt>5</rowcnt>
 <balance>0</balance>
 - <record>
   <keynum>-1</keynum>
   <keyname>2 CLIENTS HAVE A NEGATIVE
BALANCE</keyname>
   <parentkeynum>-100000</parentkeynum>
   <rowcnt>2</rowcnt>
   <balance>0</balance>
   - <record>
     <keynum>35</keynum>
     <keyname>35 MR. MICHAEL NOLAN</keyname>
     <parentkeynum>-1</parentkeynum>
     <rowcnt>1</rowcnt>
     <balance>-275</balance>
     </record>
   - <record>
     <keynum>142</keynum>
     <keyname>142 MR. JOHN CALINSKI</keyname>
     <parentkeynum>-1</parentkeynum>
     <rowcnt>1</rowcnt>
     <balance>-11</balance>
     </record>


   </record>

 </record>

</records>

Where the elements witn parentkeynum=0 to be
roots,
and elements with parentkeynum=root keynum to be
their
childrens nodes, and same thing for third level.
So
the question now is how to transform flat XML to
heirarchy XML file like this...


--~------------------------------------------------------------------
XSL-List info and archive: 
http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to:
http://lists.mulberrytech.com/xsl-list/
or e-mail:
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--




__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--