C #, XSLT, XML-преобразование древовидной структуры (дерева каталогов) - PullRequest
1 голос
/ 21 ноября 2011

Я сгенерировал 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

Учитывая приведенное выше дерево, цель состоит в том, чтобы записать дерево на консоль в Humanчитаемая форма выглядит следующим образом:

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

Теперь я могу довольно легко написать функцию, которая повторяет структуру, выводя требуемый текст, но я думаю, что XSLT потенциально может преобразовать XmlDocument в форму, показанную вышенесколько проще.Единственный вопрос, который я хотел бы задать ... как?Я немного нуб, когда дело доходит до XSLT (имеется в виду, полный нуб).Я думаю, что использование преобразования было бы более гибким методом для жесткого кодирования функции обхода и вывода.

Кроме того, было бы неплохо иметь возможность сортировать дерево XML по имени или файлу.размер, сохраняя структуру файлового дерева (сортируйте дочерние элементы каждого узла).Можно ли это сделать с помощью XSLT или я должен написать свой собственный IComparer для этого?

Спасибо за любую помощь, которую вы можете мне оказать.

1 Ответ

1 голос
/ 21 ноября 2011

Сортировка документа может быть легко выполнена с помощью 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...