xsl-list
[Top] [All Lists]

Re: [xsl] most efficient flat file listing to hierarchical

2007-01-11 03:35:33
Hi James,

I assume the files are those items that do not have further content. My take will be something like below. I believe there is still some room for optimizing the identification of a file.

<?xml version="1.0" encoding="US-ASCII"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; version="2.0">
  <xsl:output indent="yes"/>
  <xsl:template match="listing">
    <dir>
      <xsl:call-template name="group">
        <xsl:with-param name="items" select="./item"/>
      </xsl:call-template>
    </dir>
  </xsl:template>

  <xsl:template name="group">
    <xsl:param name="items" select="/.."/>
    <xsl:param name="base" select="''"/>
<xsl:for-each select="$items[not(contains(substring-after(., $base), '/'))]">
      <xsl:if test="not($items[current()!=. and contains(., current())])">
        <file name="{substring-after(., $base)}"/>
      </xsl:if>
    </xsl:for-each>
<xsl:for-each-group select="$items[contains(substring-after(., $base), '/')]" group-adjacent="substring-before(substring-after(., $base), '/')" >
      <xsl:sort select="."/>
<xsl:variable name="folder" select="substring-before(substring-after(current-group()[1], $base), '/')"/>
      <dir name="{$folder}">
        <xsl:call-template name="group">
          <xsl:with-param name="items" select="current-group()"/>
<xsl:with-param name="base" select="concat($base, $folder, '/')"/>
        </xsl:call-template>
      </dir>
    </xsl:for-each-group>
  </xsl:template>
</xsl:stylesheet>

Best Regards,
George
---------------------------------------------------------------------
George Cristian Bina
<oXygen/> XML Editor, Schema Editor and XSLT Editor/Debugger
http://www.oxygenxml.com


James Fuller wrote:
Hello All,

Can anyone propose a pure xslt (1 or 2) solution to transforming the following flat xml structure of directory paths into a hierarchical (nested) xml.

<?xml version='1.0'?>
<listing>
   <item>cn/test.xml</item>
   <item>en</item>
   <item>en/test.html</item>
   <item>en/test1.html</item>
   <item>en/resource</item>
<item>en/resource/style</item> <item>en/resource/style/test.css</item>
   <item>favicon.ico</item>
   <item>cn</item>
</listing>

   to


<dir>
<file name="favicon.ico"/>
<dir name="cn">
   <file name="test.xml"/>
</dir>
<dir name="en">
   <file name="test.html"/>
   <file name="test1.html"/>
   <dir name="resource">
       <dir name="style">
             <file name="test.css"/>
       </dir>
   </dir>
</dir>
</dir>

thx in advance.

cheers, Jim Fuller

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


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

<Prev in Thread] Current Thread [Next in Thread>