0

我想通过 XSL 在以下 XML 中找到每个不同员工的最高工资的唯一记录:

<?xml version="1.0" encoding="UTF-8"?>

<Root>

<Record recordNumber="1">
    <SALARY>20000</SALARY>
    <EMPLOYEE>Emp1</EMPLOYEE>
    <AGE>32</AGE>
</Record>
<Record recordNumber="2">
    <SALARY>34000</SALARY>
    <EMPLOYEE>Emp2</EMPLOYEE>
    <AGE>34</AGE>
</Record>
<Record recordNumber="3">
    <SALARY>12000</SALARY>
    <EMPLOYEE>Emp1</EMPLOYEE>
    <AGE>32</AGE>
</Record>
<Record recordNumber="4">
    <SALARY>15000</SALARY>
    <EMPLOYEE>Emp2</EMPLOYEE>
    <AGE>34</AGE>
</Record>
<Record recordNumber="5">
    <SALARY>22000</SALARY>
    <EMPLOYEE>Emp1</EMPLOYEE>
    <AGE>32</AGE>
</Record>
<Record recordNumber="6">
    <SALARY>35000</SALARY>
    <EMPLOYEE>Emp2</EMPLOYEE>
    <AGE>34</AGE>
</Record>
</Root>

提前致谢。

PS:但是我在这里粘贴了所有 XML 但预览不一样。所以,请不要介意。:)

4

2 回答 2

0

使用 XSLT 1.0,您可以使用Muechian 分组Record元素进行分组,然后您可以对每个组进行排序以找到具有最大 SALARY 的记录:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output indent="yes"/>

<xsl:key name="k1" match="Record" use="EMPLOYEE"/>

<xsl:template match="Root">
  <xsl:copy>
    <xsl:apply-templates select="Record[generate-id() = generate-id(key('k1', EMPLOYEE)[1])]"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="Record">
  <xsl:for-each select="key('k1', EMPLOYEE)">
    <xsl:sort select="SALARY" data-type="number" order="descending"/>
    <xsl:if test="position() = 1">
      <xsl:copy-of select="."/>
    </xsl:if>
  </xsl:for-each>
</xsl:template>

</xsl:stylesheet>
于 2012-07-06T12:27:55.760 回答
0

此 XSLT 1.0 样式表将返回每个记录,其中包含每个员工的最高工资。如果员工最多有两个或更多记录,则将返回所有最大记录。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>

<xsl:key name="employee" match="Record" use="EMPLOYEE" />

<xsl:template match="@*|node()">
 <xsl:copy>
  <xsl:apply-templates select="@*|node()"/>
 </xsl:copy>
</xsl:template>

<xsl:template match="Record[ key('employee',EMPLOYEE)/SALARY &gt; SALARY]" />

</xsl:stylesheet>

如果您只需要每位返回的员工最多一条记录,那么请更新问题并使用 Martin 的答案。

于 2012-07-06T13:57:08.907 回答