2017-12-13 3 views
1

Ich habe ein Projekt von STM32CubeMX in GPDSC Format erstellt und möchte es in Netbeans C-Projekt konvertieren. Glücklicherweise sind beide XML, also habe ich XSL-Transformation geschrieben.Multilevel-XSLT-Gruppierung und Eliminierung von Duplikaten auf der letzten Ebene

Ich bin Gruppierung component/@Cclass, dann Gruppierung von component/@Cgroup und dann möchte ich alle verschiedenen file/@name in dieser Gruppe drucken.

Hier ist XML-Beispiel Quelle:

<?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> 

Hier ist meine 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> 

Hier wird die Ausgabe von XML-Transformation:

<?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> 

Wie Sie sehen können, auf zwei Ebenen Gruppierung funktioniert, aber ich habe Knoten dupliziert, weil in der Quelle XML gibt es einige file Knoten mehrmals, z.B. stm32f0xx_ll_rcc.h.

Wie kann ich Duplikate entfernen? Ich bin auf der dritten Gruppierungsebene etwas verloren.

Antwort

0

Ich glaube, Sie müssen nur das erste Auftreten der "k3" -Gruppe verarbeiten.

So ändern:

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

zu:

<xsl:for-each select="key('k3', @name)[1]"> 
+0

Das ist es! Vielen Dank. – j123b567

Verwandte Themen