我正在尝试研究如何使用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>
非常感谢任何帮助!
答案 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>
</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>
</xsl:text><xsl:value-of select="."/>
</xsl:template>
<xsl:template match="VALUE">
<xsl:text> </xsl:text><xsl:value-of select="."/>
</xsl:template>
</xsl:stylesheet>