2011-11-21 76 views
1

我已经生成了一个XmlDocument并使用文件路径的递归遍历填充它。该文件看起来或多或少是这样的:树结构(目录树)的C#,XSLT,XML转换

<?xml version="1.0" encoding="utf-16"?> 
<Tree> 
    <Directory name="Root" path="C:\Root"> 
    <Directory name="1" path="C:\Root\1"> 
     <Directory name="3" path="C:\Root\1\3"> 
     <File name="5.png" size="198525440" path="C:\Root\1\3\5.png" /> 
     <File name="6.png" size="736621" path="C:\Root\1\3\6.png" /> 
     </Directory> 
     <File name="2.png" size="761944" path="C:\Root\1\2.png" /> 
     <File name="3.png" size="2663" path="C:\Root\1\3.png" /> 
    </Directory> 
    <Directory name="2" path="C:\Root\2"> 
     <File name="4.png" size="324187" path="C:\Root\2\4.png" /> 
    </Directory> 
    <File name="1.png" size="2663" path="C:\Root\1.png" /> 
    </Directory> 
</Tree> 

对于目录结构:

C: 
C:\Root 
C:\1 
C:\1\3 
C:\1\3\5.png 
C:\1\3\6.png 
C:\1\2.png 
C:\1\3.png 
C:\2 
C:\2\4.png 
C:\1.png 

鉴于上述树,我们的目标是树写入控制台,人类可读的形式如下:现在

Root/ 
    +-- 1/ 
    | +-- 3/ 
    | | +-- 5.png 
    | | +-- 6.png 
    | +-- 2.png 
    | +-- 3.png 
    | +-- 2/ 
    | | +-- 4.png 
    +-- 1.png 

,我可以很容易地编写递归结构,输出所需的文本的功能,但我想,XSLT可能改造的XmlDocument入T他以一种比较简单的方式显示了上面的形式。我会问的唯一问题是......怎么样?对于XSLT(意思是说,总是noob),我有点小气。我认为使用变换将是一种更为灵活的方法来硬编码遍历和输出函数。

除此之外,能够按照名称或文件大小对XML树进行排序,同时保留文件树结构(对每个节点的子节点进行排序)会很好。这可以用XSLT来完成,还是我应该编写我自己的IComparer来做到这一点?

感谢您给我提供的任何帮助。

回答

1

排序的文件可以用XSLT很容易做到,这里是一个XSLT 1.0样式,通过与参数设置属性名称排序由name属性的任何Directory子元素和任何File子元素:

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

    <xsl:param name="sort-key" select="'size'"/> 
    <xsl:param name="sort-type" select="'number'"/> 
    <xsl:param name="sort-order" select="'ascending'"/> 

    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Directory"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
     <xsl:apply-templates select="Directory"> 
     <xsl:sort select="@name" 
        data-type="text" 
        order="{$sort-order}"/> 
     </xsl:apply-templates> 
     <xsl:apply-templates select="File"> 
     <xsl:sort select="@*[local-name() = $sort-key]" 
        data-type="{$sort-type}" 
        order="{$sort-order}"/> 
     </xsl:apply-templates> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 
+0

感谢Martin。它看起来比Perl更难以理解! – Robinson

+0

好的,我打算把这个标记为答案,因为我认为最初的问题是无理地要求你教我所有关于XSLT的知识! – Robinson