xslt 使用 Muenchian 分组删除重复项
xslt to remove duplicates entries using Muenchian grouping
我正在尝试显示 <company>
节点的所有 <department>
。但我不想显示来自同一个 company
.
的 department
的重复条目
XML:
<employee_data>
<employeedetails id="1">
<company id="1">
<companyname>AOL</companyname>
<department>IT</department>
</company>
<employeename>Patrick</employeename>
<employeedesg>Software Engineer</employeedesg>
<employeesalary>18000</employeesalary>
<employeedoj>10/03/2015</employeedoj>
</employeedetails>
..... similar sets......
..... similar sets......
<employeedetails id="10">
<company id="1">
<companyname>AOL</companyname>
<department>IT</department>
</company>
<employeename>Patricia</employeename>
<employeedesg>HR Assistant</employeedesg>
<employeesalary>18000</employeesalary>
<employeedoj>10/03/2015</employeedoj>
</employeedetails>
</employee_data>
根据以上XML,我想消除IT
部门
的重复条目
示例:AOL
不止一次有IT
部门,但我只想显示一次IT
。
截至目前,我的 XSLT 如下所示:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" />
<xsl:key name="companyname" match="company" use="companyname"/>
<xsl:template match="/">
<xsl:for-each select="/employee_data/employeedetails/company[generate-id() = generate-id(key('companyname', companyname)[1])]">
<tr>
<td>
<xsl:value-of select="@id"/>
</td>
<td>
<xsl:apply-templates select="key('companyname', companyname)" />
</td>
</tr>
</xsl:for-each>
</xsl:template>
<xsl:template match="company">
<xsl:value-of select="department" />
<br />
</xsl:template>
</xsl:stylesheet>
screenshot中突出显示的部门不应显示两次。
您需要第二级 Muenchian 分组 - 您已经有了一个可以找到唯一公司名称的键,现在您需要第二个键来找到唯一的公司部门 对:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" />
<xsl:key name="companyname" match="company" use="companyname"/>
<xsl:key name="companyDepartment" match="company"
use="concat(companyname, '|', department)" />
<xsl:template match="/">
<xsl:for-each select="/employee_data/employeedetails/company[generate-id() = generate-id(key('companyname', companyname)[1])]">
<tr>
<td>
<xsl:value-of select="@id"/>
</td>
<td>
<xsl:apply-templates select="key('companyname', companyname)
[generate-id() = generate-id(key('companyDepartment',
concat(companyname, '|', department))[1])]" />
</td>
</tr>
</xsl:for-each>
</xsl:template>
<xsl:template match="company">
<xsl:value-of select="department" />
<br />
</xsl:template>
</xsl:stylesheet>
这会筛选出与当前 companyname
匹配的所有 company
元素的列表,这样您就可以得到每个 department
.
的第一个提及项
我正在尝试显示 <company>
节点的所有 <department>
。但我不想显示来自同一个 company
.
department
的重复条目
XML:
<employee_data>
<employeedetails id="1">
<company id="1">
<companyname>AOL</companyname>
<department>IT</department>
</company>
<employeename>Patrick</employeename>
<employeedesg>Software Engineer</employeedesg>
<employeesalary>18000</employeesalary>
<employeedoj>10/03/2015</employeedoj>
</employeedetails>
..... similar sets......
..... similar sets......
<employeedetails id="10">
<company id="1">
<companyname>AOL</companyname>
<department>IT</department>
</company>
<employeename>Patricia</employeename>
<employeedesg>HR Assistant</employeedesg>
<employeesalary>18000</employeesalary>
<employeedoj>10/03/2015</employeedoj>
</employeedetails>
</employee_data>
根据以上XML,我想消除IT
部门
示例:AOL
不止一次有IT
部门,但我只想显示一次IT
。
截至目前,我的 XSLT 如下所示:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" />
<xsl:key name="companyname" match="company" use="companyname"/>
<xsl:template match="/">
<xsl:for-each select="/employee_data/employeedetails/company[generate-id() = generate-id(key('companyname', companyname)[1])]">
<tr>
<td>
<xsl:value-of select="@id"/>
</td>
<td>
<xsl:apply-templates select="key('companyname', companyname)" />
</td>
</tr>
</xsl:for-each>
</xsl:template>
<xsl:template match="company">
<xsl:value-of select="department" />
<br />
</xsl:template>
</xsl:stylesheet>
screenshot中突出显示的部门不应显示两次。
您需要第二级 Muenchian 分组 - 您已经有了一个可以找到唯一公司名称的键,现在您需要第二个键来找到唯一的公司部门 对:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" />
<xsl:key name="companyname" match="company" use="companyname"/>
<xsl:key name="companyDepartment" match="company"
use="concat(companyname, '|', department)" />
<xsl:template match="/">
<xsl:for-each select="/employee_data/employeedetails/company[generate-id() = generate-id(key('companyname', companyname)[1])]">
<tr>
<td>
<xsl:value-of select="@id"/>
</td>
<td>
<xsl:apply-templates select="key('companyname', companyname)
[generate-id() = generate-id(key('companyDepartment',
concat(companyname, '|', department))[1])]" />
</td>
</tr>
</xsl:for-each>
</xsl:template>
<xsl:template match="company">
<xsl:value-of select="department" />
<br />
</xsl:template>
</xsl:stylesheet>
这会筛选出与当前 companyname
匹配的所有 company
元素的列表,这样您就可以得到每个 department
.