[2 days left] What’s wrong with your cloud strategy? Learn why multicloud solutions matter with Nimble Storage.Register Now

x
?
Solved

XSLT Sarissa XML

Posted on 2011-09-13
6
Medium Priority
?
436 Views
Last Modified: 2012-05-12
Hi,

I have some XML. I am trying to create a structure that works in much the same way as Windows Explorer. My XSL seems to break down here, on my for loop, which I basically cut and paste from another source.

<xsl:for-each select="key('obj', $detail-id)/*[not(self::name)]">        

I was hoping someone would know how I can get it too render properly. So that I can click on an item and it goes into the next level displaying all of these items. I am using sarissa, I can gladly provide the .js though I think it is problem with this loop structure where the problem exists.

NOTE- The below code is only done for type 'folder', it is intended for type folder and file, both of which can be placed at any level, and can have each other inside each other.

Thanks in advance.
Here is xml example:

<?xml version="1.0" encoding="utf-8"?>
<testData>
  <items id="0">
    <item id="1" name="Item1" type="file">
      <item id="4" name="Item4" type="folder">
        <item id="5" name="Item5" type="file"/>
        <item id="6" name="Item6" type="folder" />
      </item>
      <item id="2" name="Item2" type="folder" />
        <item id="3" name="Item3" type="folder"  />
      </item>
   </items>
</testData>

Here is xsl structure:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:key name="obj" match="*" use="@id"/>
  <xsl:param name="detail-id">sms</xsl:param>
  <xsl:template match="testData">
  <xsl:apply-templates />
  </xsl:template>
<xsl:template match="item/*">
      <xsl:for-each select="key('obj', $detail-id)/*[not(self::name)]">  
        <xsl:choose>
          <xsl:when test="@type = 'folder'">
            <span id="{@id}" >
              <xsl:attribute name="onclick">
                <xsl:text>DisplayResult('</xsl:text>
                <xsl:value-of select="@id"/>
                <xsl:text>','</xsl:text>
                <xsl:value-of select="name()"/>
                <xsl:text>');</xsl:text>
              </xsl:attribute>
              <xsl:value-of select="@name"></xsl:value-of>
            </span>
          </xsl:when>
        </xsl:choose>        
      </xsl:for-each>
  </xsl:template>
  </xsl:stylesheet>

Open in new window

0
Comment
Question by:metta0_3
[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
  • 3
  • 3
6 Comments
 
LVL 60

Accepted Solution

by:
Geert Bormans earned 2000 total points
ID: 36530047
If this is XSLT for Sarissa, it is bound to break,
Sarissa requires wellformed XML as a transform result... meaning one single root

further more, it is not very clear what you need.
Do you want to expand one further level given the id?
that the following is about what you need

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:key name="obj" match="*" use="@id"/>
    <xsl:param name="detail-id">1</xsl:param>
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="testData">
        <!-- relies on teh key only returning one object -->
        <xsl:apply-templates select="key('obj', $detail-id)"/>
    </xsl:template>
    <xsl:template match="item"><!-- actually only the keyed one -->
        <div><!-- creating a container for Sarissa -->
            <xsl:copy-of select="@id | @name"/> <!-- at least copying the id for later overwrite -->
            <xsl:for-each select="*">
                <xsl:if test="@type = 'folder'">
                    <span id="{@id}" >
                        <xsl:attribute name="onclick">
                            <xsl:text>DisplayResult('</xsl:text>
                            <xsl:value-of select="@id"/>
                            <xsl:text>','</xsl:text>
                            <xsl:value-of select="name()"/>
                            <xsl:text>');</xsl:text>
                        </xsl:attribute>
                        <xsl:value-of select="@name"></xsl:value-of>
                    </span>
                </xsl:if>
            </xsl:for-each>        
        </div>
    </xsl:template>
</xsl:stylesheet>

Open in new window

0
 
LVL 60

Expert Comment

by:Geert Bormans
ID: 36530055
now you need a smart override, by letting the XSL result override the outer html of the identified div
that is how you can close the stuff back if you want later
0
 

Author Comment

by:metta0_3
ID: 36530220
What you have provided is pretty close. Thanks. detail-id set to 1 is causing an issue for me. Its for a search filter, so a user might decide to start the search from another item within the tree. The xml is actually the result based on what is sent to the server by the user.

<xsl:param name="detail-id">1</xsl:param>

Open in new window


For example the result might be further in the tree like this

<?xml version="1.0" encoding="utf-8"?>
<testData>
  <items id="0">
      <item id="4" name="Item4" type="folder">
        <item id="5" name="Item5" type="file"/>
        <item id="6" name="Item6" type="folder" />
      </item>
      <item id="2" name="Item2" type="folder" />
        <item id="3" name="Item3" type="folder"  />
      </item>
</testData>

Open in new window


Therefore item 4 and 2 are the first to be displayed. Also it is unlimited the levels that I wish to be able to click through.

0
Simplify Your Workload with One Tool

How do you combat today’s intelligent hacker while managing multiple domains and platforms? By simplifying your workload with one tool. With Lunarpages hosting through Plesk Onyx, you can:

Automate SSL generation and installation with two clicks
Experience total server control

 

Author Comment

by:metta0_3
ID: 36530268
Ok this seems to work as I always have the root element id=0. I think I am there.
<xsl:param name="detail-id">1</xsl:param>

Open in new window


Athough can I do this, just to save code.

<xsl:if test="@type = 'folder'" | "@type='file'>

Open in new window

0
 

Author Comment

by:metta0_3
ID: 36530296
The above comment was meant to say this.

<xsl:param name="detail-id">1</xsl:param>

Open in new window


Now I just want to shorten the below as I am producing unnecessary code.

<xsl:for-each select="*">
          <xsl:if test="@type = 'folder'">
            <span id="{@id}" >
              <xsl:attribute name="onclick">
                <xsl:text>DisplayOverview('</xsl:text>
                <xsl:value-of select="@id"/>
                <xsl:text>','</xsl:text>
                <xsl:value-of select="name()"/>
                <xsl:text>');</xsl:text>
              </xsl:attribute>
              <xsl:value-of select="@name"></xsl:value-of>
            </span>
          </xsl:if>
          <xsl:if test="@type = 'file'">
            <span id="{@id}" >
              <xsl:attribute name="onclick">
                <xsl:text>DisplayOverview('</xsl:text>
                <xsl:value-of select="@id"/>
                <xsl:text>','</xsl:text>
                <xsl:value-of select="name()"/>
                <xsl:text>');</xsl:text>
              </xsl:attribute>
              <xsl:value-of select="@name"></xsl:value-of>
            </span>
          </xsl:if>
        </xsl:for-each>

Open in new window

0
 
LVL 60

Expert Comment

by:Geert Bormans
ID: 36532186
Hi,

was gone for a while, seems you fixed it by now

<xsl:if test="@type = 'folder'" | "@type='file'>

should be

<xsl:if test="@type = 'folder'" or "@type='file'>
0

Featured Post

Plesk WordPress Toolkit

Plesk's WordPress Toolkit allows server administrators, resellers and customers to manage their WordPress instances, enabling a variety of development workflows for WordPress admins of all skill levels, from beginners to pros.

See why 2/3 of Plesk servers use it.

Question has a verified solution.

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

Does your audience prefer people in photos or no people? How can you best highlight what you’re selling? What are your competitors doing, and what can you do that is different and unique from them?  Continue reading to learn how to make your images …
This article discusses how to implement server side field validation and display customized error messages to the client.
Viewers will get an overview of the benefits and risks of using Bitcoin to accept payments. What Bitcoin is: Legality: Risks: Benefits: Which businesses are best suited?: Other things you should know: How to get started:
The viewer will learn how to count occurrences of each item in an array.
Suggested Courses

656 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