Groupby不同我该怎么做?

时间:2011-01-05 14:52:07

标签: xslt xpath

<?xml version="1.0"?>
<Products>
     <product>
         <productId >1</productId>
          <textdate>11/11/2011</textdate>
          <price>200</price>
      </product>
  <product>
         <productId >6</productId>
          <textdate>11/11/2011</textdate>
          <price>100</price>
      </product>
  <product>
         <productId >1</productId>
          <textdate>16/11/2011</textdate>
          <price>290</price>
      </product>
</Products>

我有这个xml,我想要一个xslt转换,重新组合这样的产品:

{产品1:
      11/11/2011 - 200
      16/11/2011 - 290}
   {产品6
      11/11/2011 - 100}

我使用xslt 1.0 Asp .net C#XslCompiledTransformation

2 个答案:

答案 0 :(得分:1)

使用Muenchian分组,如下所述:http://www.jenitennison.com/xslt/grouping/index.xml。如果您在编写代码时需要帮助,请说明您是否希望以您发布的格式输出纯文本或HTML输出。

答案 1 :(得分:1)

这个XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>

<xsl:key name="groupById" match="product" use="productId"/>

<xsl:template match="/*">
    <xsl:apply-templates select="product[
                        generate-id() =
                        generate-id( key( 'groupById', productId ) )
                        ]"/>
</xsl:template>

<xsl:template match="product">
    <xsl:text>{ product </xsl:text>
    <xsl:value-of select="concat(productId, ' : &#xa;')"/>
    <xsl:apply-templates select="key( 'groupById', productId )" mode="inner-content"/>
    <xsl:text> }&#xa;</xsl:text>
</xsl:template>

<xsl:template match="product" mode="inner-content">
    <xsl:value-of select="concat( textdate, ' - ', price )"/>
    <xsl:if test="position() != last()">
        <xsl:text>&#xa;</xsl:text>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>

应用于您的代码示例,它将产生以下结果:

{ product 1 : 
11/11/2011 - 200
16/11/2011 - 290 }
{ product 6 : 
11/11/2011 - 100 }