消除XSLT中的重复文件名

时间:2013-12-18 19:07:50

标签: xslt xpath

我陷入了XSLT程序,它消除了输出中的重复项。帮助赞赏

XML输入:

<changelog> 
<entry>     
    <file>
        <name>web/JavaSource/oig/asoig/web/resource/AsoigResources.properties</name>
        <revision>1.7.2.6</revision>
        <prevrevision>1.7.2.5</prevrevision>
    </file>     
</entry>
<entry>     
    <file>
        <name>AdminEJB/ejbModule/oig/admin/dao/schema/TableCode.java</name>
        <revision>1.1.4.2</revision>
        <prevrevision>1.1.4.1</prevrevision>
    </file>
    <file>
        <name>web/JavaSource/oig/asoig/web/resource/AsoigResources.properties</name>
        <revision>1.7.2.6</revision>
        <prevrevision>1.7.2.5</prevrevision>
    </file>     
</entry>    
</changelog>

期望的输出:

web/JavaSource/oig/asoig/web/resource/AsoigResources.properties
AdminEJB/ejbModule/oig/admin/dao/schema/TableCode.java

注意:AsoigResources.properties在输入XML中是重复的。

使用的XSLT代码:

<xsl:for-each select="entry/file">
    <tr>
        <td><xsl:value-of select="name"/></td>        
    </tr>
</xsl:for-each>

我需要XSLT来删除重复项。我尝试使用“follow-sibling”,但没有帮助。

3 个答案:

答案 0 :(得分:4)

您可以为xsl:for-each使用以下XPath表达式:

entry/file[not(name = preceding::name)]

选择名称与之前名称不匹配的文件。

答案 1 :(得分:4)

XPath(并且,通过扩展XSLT)2.0包含一个distinct-values()函数,它将完全满足您的需要。此外,它使您的<xsl:for-each/>表达式变得不必要。

<xsl:value-of select="distinct-values(entry/file/name)" />

答案 2 :(得分:1)

使用 key() Muenchen method 的另一个XSLT 1.0替代方案:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="yes"/>

    <xsl:key name="fileByName" match="file" use="name"/>

    <xsl:template match="changelog">
      <xsl:for-each select="entry/file[generate-id() =
                                       generate-id(key('fileByName', name)[1])]">
           <tr>
               <td><xsl:value-of select="name"/></td>        
           </tr>
      </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>