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レベルで少し失われています。
だそれ!ありがとうございました。 – j123b567