C#,XSLT,树结构的XML转换(目录树)

时间:2011-11-21 16:25:11

标签: c# xml xslt

我已经生成了一个XmlDocument,并使用文件路径的递归遍历来填充它。该文件或多或少看起来像这样:

<?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转换为上面显示的形式。我要问的唯一问题是......怎么样?对于XSLT(意思是一个总的菜鸟),我有点像菜鸟。我认为使用变换将是一种更灵活的方法来硬编码遍历和输出函数。

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

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:1)

使用XSLT可以轻松地对文档进行排序,这是一个XSLT 1.0样式表,它按Directory属性对任何name子元素进行排序,并按属性名称对任何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>
相关问题