我陷入了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”,但没有帮助。
答案 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>