2017-12-13 32 views
1

私はプロジェクトをSTM32CubeMXでGPDSCフォーマットで生成しました。Netbeans Cプロジェクトに変換したいと思います。幸いにも、両方ともXMLなので、私はXSL変換を書いています。マルチレベルのXSLTグループ化と最後のレベルで重複を排除

私はグループ化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れる:あなたが見ることができるように、2つのレベル

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

グループ化は機能しますが、ソースXMLにはがあるので、itemPathノードが重複しています複数のノードが個存在します。​​。

重複を削除するにはどうすればよいですか?私はグループ分けの第3レベルで少し失われています。

答えて

0

「k3」グループの最初の出現を処理する必要があると思います。

だから変更:

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

に:それ

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

だそれ!ありがとうございました。 – j123b567

関連する問題