如何找到依赖于其他元素的Max和min?

时间:2012-07-06 12:10:40

标签: xslt xslt-1.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>

提前致谢。

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

2 个答案:

答案 0 :(得分:0)

使用XSLT 1.0,您可以使用Muechian groupingRecord元素进行分组,然后您可以对每个组进行排序以查找具有最大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>

答案 1 :(得分: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的答案。