树结构(目录树)的C#,XSLT,XML转换
问题描述:
我已经生成了一个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来做到这一点?
感谢您给我提供的任何帮助。
答
排序的文件可以用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>
感谢Martin。它看起来比Perl更难以理解! – Robinson
好的,我打算把这个标记为答案,因为我认为最初的问题是无理地要求你教我所有关于XSLT的知识! – Robinson