Arhn - архитектура программирования

Многоуровневая группировка XSLT и удаление дубликатов на последнем уровне

У меня есть проект, созданный STM32CubeMX в формате GPDSC и Я хотел бы преобразовать его в проект Netbeans C. К счастью, оба являются XML, поэтому я написал XSL-преобразование.

Я группирую component/@Cclass, затем группирую по component/@Cgroup, а затем я хочу напечатать все отдельные file/@name в этой группе.

Вот пример исходного XML:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<package>
<components>
    <component Cclass="CMSIS" Cgroup="CORE">
    <files>
        <file name="core_cm0.h"/>
    </files>
    </component>
    <component Cclass="Device" Cgroup="Startup">  
    <files>
        <file name="stm32f0xx.h"/>
    </files>
    </component>
    <component Cclass="Device" Cgroup="STM32Cube HAL" Csub="USART">
    <files>
        <file name="stm32f0xx_ll_usart.h"/>
        <file name="stm32f0xx_ll_rcc.h"/>
    </files>
    </component>
    <component Cclass="Device" Cgroup="STM32Cube HAL" Csub="RCC">
    <files>
        <file name="stm32f0xx_ll_cortex.h"/>
        <file name="stm32f0xx_ll_rcc.h"/>
    </files>
    </component>
</components>
</package>

Вот мое преобразование XSL

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="utf-8" indent="yes"/> 

<xsl:key name="k1" match="component" use="@Cclass"/>
<xsl:key name="k2" match="component" use="concat(@Cclass, '|', @Cgroup)"/>
<xsl:key name="k3" match="file" use="@name"/>

<xsl:template name="file-classes" match="components">
    <xsl:for-each select="component[generate-id() = generate-id(key('k1', @Cclass)[1])]">
        <logicalFolder projectFiles="true">
        <xsl:attribute name="displayName"><xsl:value-of select="@Cclass" /></xsl:attribute>
        <xsl:for-each select="key('k1', @Cclass)[generate-id() = generate-id(key('k2', concat(@Cclass, '|', @Cgroup))[1])]">
            <logicalFolder projectFiles="true">
            <xsl:attribute name="displayName"><xsl:value-of select="@Cgroup" /></xsl:attribute>
            <xsl:for-each select="key('k2', concat(@Cclass, '|', @Cgroup))">
                <xsl:for-each select="files/file[generate-id() = generate-id(key('k3', @name)[1])]">
                    <xsl:sort select="@name" />
                    <xsl:for-each select="key('k3', @name)">
                        <itemPath><xsl:value-of select="@name" /></itemPath>
                    </xsl:for-each>
                </xsl:for-each>
            </xsl:for-each>
            </logicalFolder>
        </xsl:for-each>
        </logicalFolder>
    </xsl:for-each>
</xsl:template>

<xsl:template match="/">
    <xsl:for-each select="package/components">
    <xsl:call-template name="file-classes"/>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

Вот выходной XML:

<?xml version="1.0" encoding="utf-8"?>
<logicalFolder projectFiles="true" displayName="CMSIS">
  <logicalFolder projectFiles="true" displayName="CORE">
    <itemPath>core_cm0.h</itemPath>
  </logicalFolder>
</logicalFolder>
<logicalFolder projectFiles="true" displayName="Device">
  <logicalFolder projectFiles="true" displayName="Startup">
    <itemPath>stm32f0xx.h</itemPath>
  </logicalFolder>
  <logicalFolder projectFiles="true" displayName="STM32Cube HAL">
    <itemPath>stm32f0xx_ll_rcc.h</itemPath>
    <itemPath>stm32f0xx_ll_rcc.h</itemPath>
    <itemPath>stm32f0xx_ll_usart.h</itemPath>
    <itemPath>stm32f0xx_ll_cortex.h</itemPath>
  </logicalFolder>
</logicalFolder>

Как видите, два уровня группировки работают, но у меня есть повторяющиеся узлы itemPath, потому что в исходном XML есть несколько узлов file несколько раз, например. stm32f0xx_ll_rcc.h.

Как я могу удалить дубликаты? Я немного потерялся на третьем уровне группировки.

13.12.2017

Ответы:


1

Я считаю, что вам просто нужно обработать первое появление группы «k3».

Итак, измените:

<xsl:for-each select="key('k3', @name)">

to:

<xsl:for-each select="key('k3', @name)[1]">
13.12.2017
  • Вот и все! Спасибо. 13.12.2017
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..