metta0_3
asked on
XSLT Sarissa XML
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::na me)]">
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.
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::na
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>
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
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.
For example the result might be further in the tree like this
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.
<xsl:param name="detail-id">1</xsl:param>
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>
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.
ASKER
Ok this seems to work as I always have the root element id=0. I think I am there.
Athough can I do this, just to save code.
<xsl:param name="detail-id">1</xsl:param>
Athough can I do this, just to save code.
<xsl:if test="@type = 'folder'" | "@type='file'>
ASKER
The above comment was meant to say this.
Now I just want to shorten the below as I am producing unnecessary code.
<xsl:param name="detail-id">1</xsl:param>
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>
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'>
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'>
that is how you can close the stuff back if you want later