Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Убрать дубли из выборки по многоуровневой структуре / 3 сообщений из 3, страница 1 из 1
18.12.2009, 16:45
    #36374366
abc_da
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убрать дубли из выборки по многоуровневой структуре
Добрый день. Имею примерно следующий XML:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
<root>
    <folder name="f1">
        <subfolder>
            <file type="pdf"/>
            <file type="bmp"/>
            <file type="pdf"/>
        </subfolder>
        <subfolder>
            <file type="zip"/>
            <file type="pdf"/>
        </subfolder>
    </folder>
    <folder name="f2">
        <subfolder>
            <file type="zip"/>
            <file type="doc"/>
            <file type="pdf"/>
        </subfolder>
        <subfolder>
            <file type="bmp"/>
            <file type="bmp"/>
        </subfolder>
    </folder>
</root>

Моя задача - посчитать, сколько файлов каждого типа находится во всех подпапках заданной папки и вывести примерно такую таблицу:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
f1:
  pdf -  3 
  bmp -  1 
  zip -  1 
f2:
  zip -  1 
  doc -  1 
  pdf -  1 
  bmp -  2 

Использую вот такой шаблон:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<xsl:template match="root">
    <xsl:for-each select="folder">
        <xsl:variable name="folderName" select="@name"/>
        <xsl:value-of select="$folderName"/>:<br/>
        <xsl:for-each select="subfolder/file">
            <xsl:if test="not(preceding-sibling::file[@type = current()/@type])">
                <xsl:value-of select="@type"/> - 
                <xsl:value-of select="count(/root/folder[@name = $folderName]/subfolder/file[@type = current()/@type])"/><br/>
            </xsl:if>
        </xsl:for-each>
    </xsl:for-each>
</xsl:template>

Считает этот шаблон хорошо, но от дублей избавиться целиком не получается, потому что preceding-sibling:: смотрит только внутри subfolder'а - родителя по структуре XML, а не по результатам выборки.

Пробовал использовать вместо preceding-sibling:: просто preceding:: , но тогда поиск осуществляется по всем folder'ам.

Подскажите, пожалуйста, как мне переписать условие подсчета, чтобы избавиться от дублей внутри отдельной папки?
...
Рейтинг: 0 / 0
19.12.2009, 00:08
    #36375022
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убрать дубли из выборки по многоуровневой структуре
Код: plaintext
<xsl:if test="not(preceding-sibling::file[@type = current()/@type]) and not(../preceding-sibling::subfolder/file[@type = current()/@type])">

С уважением, Vasilisk
...
Рейтинг: 0 / 0
19.12.2009, 18:49
    #36375569
abc_da
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убрать дубли из выборки по многоуровневой структуре
спасибо
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Убрать дубли из выборки по многоуровневой структуре / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]