父节点和子节点交换xslt

时间:2015-11-20 03:01:06

标签: xslt

下面是我所拥有的xml代码,在输入XSLT时,提供了XSLT代码,并且我提供了预期的输出和区域。这是关于资产和相应基准表的示例。

            <BaseMeter>
                <MeterName>Meter description</MeterName>
                <MeterCode>Meter1</MeterCode>
                <ASSETID>
                    <Name>Airco Unit</Name>
                    <Code>ID1</Code>
                </ASSETID>
            </BaseMeter>
 <BaseMeter>
                <MeterName>Meter description</MeterName>
                <MeterCode>Meter2</MeterCode>
                <ASSETID>
                    <Name>Airco Unit</Name>
                    <Code>ID1</Code>
                </ASSETID>
            </BaseMeter>

转换的XML应如下所示。通过xslt实际转换的xml代码也在下面提供。

<Asset>
   AssetID
   AssetName
   <Meter>
       MeterID (eg. Meter 1)
       MeterName
   <Meter>
   <Meter>
       MeterID (eg. Meter 2)
       MeterName
   <Meter>

我使用了下面的XSLT

 <xsl:template match="/">

        <xsl:for-each-group select="BaseMeter" group-by="AssetID/Code">
            <Asset ID="{current-grouping-key()}">
                <xsl:copy-of select="current-group()"/>

            </Asset>
        </xsl:for-each-group>

    </xsl:template>   

输出就是这样,但是资产ID和名称再次被捕获为资产标记的子项,如何删除它们以使它们不出现在输出中或转换为xml enter code here

<Asset ID="000244">
   <BaseMeter>

                <MeterName>Meter Name</MeterName>
                <MeterCode>0040</MeterCode>
                <AssetID>
                    <Name>Airco Unit</Name>
                    <Code>000244</Code>
                </AssetID>
            </BaseMeter>

这是我面临的问题..如果有人可以帮助我,那将是非常好的。我已经使用group by而无法破解如何删除再次出现的资产ID。

1 个答案:

答案 0 :(得分:1)

您想要的输出看起来很奇怪,因此有一个模板可以产生更多的计算输出:

<xsl:template match="/">    
    <xsl:for-each-group select="BaseMeter" group-by="ASSETID/Code">
        <Asset ID="{current-grouping-key()}">
            <xsl:for-each select="current-group()">
                <Meter>
                    <xsl:copy-of select="MeterName|MeterCode"/>
                </Meter>
            </xsl:for-each>
        </Asset>
    </xsl:for-each-group>    
</xsl:template>  

结果:

<Asset ID="ID1">
   <Meter>
      <MeterName>Meter description</MeterName>
      <MeterCode>Meter1</MeterCode>
   </Meter>
   <Meter>
      <MeterName>Meter description</MeterName>
      <MeterCode>Meter2</MeterCode>
   </Meter>
</Asset>