>我有这个XML。基金多次出现,基金内部有基金字段。该基金的基金ID在每个基金中都是唯一的。 但是,与基金的其他事件相比,它可以重复。
例如:- 在第一个基金中,FundIn.fundId分别为7和23。在第二个基金中,FundIn.fundId是10,7和3。 如果您比较两个基金,FundIn.fundId = 7 是重复的。 因此,我只想显示此ID的第一次出现,其中InPerc为24.66。
<Fund>
<id>14</id>
<FundOut>
<FundIn>
<fundId>7</fundId>
<InPerc>24.66</InPerc>
<Unit>
<Price>18.43</Price>
<Date>2017-06-21</Date>
</Unit>
</FundIn>
<FundIn>
<fundId>23</fundId>
<InPerc>75.34</InPerc>
<Unit>
<Price>13.81</Price>
<Date>2017-06-21</Date>
</Unit>
</FundIn>
</FundOut>
</Fund>
<Fund>
<id>8</id>
<FundOut>
<FundIn>
<fundId>10</fundId>
<InPerc>55</InPerc>
<Unit>
<Price>6.4</Price>
<Date>2017-06-21</Date>
</Unit>
</FundIn>
<FundIn>
<fundId>7</fundRef>
<InPerc>20</InPerc>
<Unit>
<Price>18.43</Price>
<Date>2017-06-21</Date>
</Unit>
</FundIn>
<FundIn>
<fundId>3</fundId>
<InPerc>25</InPerc>
<Unit>
<Price>36.57</Price>
<Date>2017-06-21</Date>
</Unit>
</FundIn>
</FundOut>
</Fund>
输出-
<FundPrint>
<id>14</id>
<FundOut>
<FundIn>
<fundId>7</fundId>
<InPerc>24.66</InPerc>
<Unit>
<Price>18.43</Price>
<Date>2017-06-21</Date>
</Unit>
</FundIn>
<FundIn>
<fundId>23</fundId>
<InPerc>75.34</InPerc>
<Unit>
<Price>13.81</Price>
<Date>2017-06-21</Date>
</Unit>
</FundIn>
</FundOut>
</FundPrint>
<FundPrint>
<id>8</id>
<FundOut>
<FundIn>
<fundId>10</fundId>
<InPerc>55</InPerc>
<Unit>
<Price>6.4</Price>
<Date>2017-06-21</Date>
</Unit>
</FundIn>
<FundIn>
<fundId>3</fundId>
<InPerc>25</InPerc>
<Unit>
<Price>36.57</Price>
<Date>2017-06-21</Date>
</Unit>
</FundIn>
</FundOut>
</FundPrint>
请帮助一些工作代码。
你应该以相反的方式看待这个问题。与其说要为每个不同的fundId
选择第一个FundIn
,不如说您真正想做的是复制所有元素,除了具有重复fundId
值的元素。
复制元素是使用标识模板完成的
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
这将复制所有节点,因此您需要添加一个模板来处理在您的案例中重复的FundIn
元素的情况。如注释中所述,这可以被视为一种分组形式,因为 XSLT 1.0 中的分组涉及查找每个不同值的第一个元素,然后获取具有相同值的其余元素。在这种情况下,您希望丢弃这些剩余元素。
因此,定义一个键,如下所示:
<xsl:key name="funds" match="FundIn" use="fundId" />
然后要丢弃"重复项",请使用以下模板:
<xsl:template match="FundIn[generate-id() != generate-id(key('funds', fundId)[1])]" />
试试这个 XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:key name="funds" match="FundIn" use="fundId" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="Fund">
<FundPrint>
<xsl:apply-templates />
</FundPrint>
</xsl:template>
<xsl:template match="FundIn[generate-id() != generate-id(key('funds', fundId)[1])]" />
</xsl:stylesheet>
这假定您的输入 XML 格式正确(因此具有单个根元素(。
有关其实际操作的示例,请参阅 http://xsltfiddle.liberty-development.net/ejivdGD。