XSL按标签分组项目而不是属性

时间:2014-11-17 16:26:05

标签: xml xslt foreach grouping

我正在尝试研究如何使用XSL按标记对XML进行分组。基本上我希望所有记录首先输出A,然后输出B,然后输出C,如果它们存在,则在本例中不存在。

<PAYSLIP>
 <RECORD.MISC>
  <EMP_ID>0009011</EMP_ID>
  <ITEM.MISC>
   <ID>1001</ID>
   <DESCRIPTION>First Job Pay</DESCRIPTION>
   <VALUE>1000</VALUE>
   <SOURCE>A</SOURCE>
  </ITEM.MISC>
  <ITEM.MISC>
   <ID>1001</ID>
   <DESCRIPTION>Second Job Pay</DESCRIPTION>
   <VALUE>500</VALUE>
   <SOURCE>B</SOURCE>  
  </ITEM.MISC> 
  <ITEM.MISC>
   <ID>1001</ID>
   <DESCRIPTION>Car Allowance</DESCRIPTION>
   <VALUE>50</VALUE>
   <SOURCE>A</SOURCE>  
  </ITEM.MISC> 
 </RECORD.MISC>
</PAYSLIP>

所需的输出是:

>A
>First Job Pay  1000
>Car Allowance  50
>B
>Second Job Pay 500

我可以使用以下XSL实现此目的,但无法解决如何使用for-each-group或key语句来执行此操作?目前我将不得不为字母表中的每个字母重复这段代码,这些字母效率不高,所以我很想学习另一种方法吗?

<xsl:for-each select="ITEM.MISC[SOURCE='A']">
<tr><xsl:value-of select="SOURCE"/></tr>
<tr>
 <td class="description">
   <xsl:value-of select="DESCRIPTION"/>
 </td>
 <td></td>
 <td class="value">
   <xsl:call-template name="formatnumber">
     <xsl:with-param name="value"><xsl:value-of select="VALUE"/></xsl:with-param>
   </xsl:call-template>
 </td>
</tr>
</xsl:for-each>
<xsl:for-each select="ITEM.MISC[SOURCE='B']">
<tr><xsl:value-of select="SOURCE"/></tr>
<tr>
 <td class="description">
   <xsl:value-of select="DESCRIPTION"/>
 </td>
 <td></td>
 <td class="value">
   <xsl:call-template name="formatnumber">
     <xsl:with-param name="value"><xsl:value-of select="VALUE"/></xsl:with-param>
   </xsl:call-template>
 </td>
</tr>
</xsl:for-each>

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

试试这个:

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

<xsl:template match="PAYSLIP">
    <xsl:for-each-group select="//ITEM.MISC" group-by="SOURCE">
        <xsl:text>&#xa;</xsl:text><xsl:value-of select="current-grouping-key()"/>
        <xsl:apply-templates select="current-group()/DESCRIPTION|current-group()/VALUE"/>
    </xsl:for-each-group>
</xsl:template>

<xsl:template match="DESCRIPTION">
    <xsl:text>&#xa;</xsl:text><xsl:value-of select="."/>
</xsl:template>

<xsl:template match="VALUE">
    <xsl:text> </xsl:text><xsl:value-of select="."/>
</xsl:template>

</xsl:stylesheet>