2011-01-05 8 views
0
<?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> 

Ich habe diese xml und ich mag eine XSLT-Transformation, das Produkt so etwas wie diese neu gruppieren:Groupby distinct Wie kann ich das tun?

{Produkt 1:
11.11.2011 - 200
16.11.2011 - 290}
{Produkt 6
11.11.2011 - 100}

I mit XSLT 1.0 Asp .net C# XslCompiledTransformation

Antwort

1

Verwendung Muenc arbeiten Hian-Gruppierung wie hier erläutert: http://www.jenitennison.com/xslt/grouping/index.xml. Wenn Sie Hilfe beim Schreiben des Codes benötigen, geben Sie bitte an, ob Sie eine reine Textausgabe oder HTML-Ausgabe in dem von Ihnen geposteten Format wünschen.

+0

Sehr gut dank Sie –

1

Dieses 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> 

auf Ihre Codebeispiel angewendet wird, wird es dieses Ergebnis produzieren:

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

+1 für eine konkrete eine informative Lösung. –

+0

+1 Gute Antwort. Innerer Inhalt könnte mit einer neuen Zeile beginnen (anstelle der innersten neuen Zeile in der 'product'-Regel) und auf diese Weise vermeiden Sie den Positionstest. –

+0

@ Alejandro, gute Bemerkung, danke für's Bemerken. – Flack

Verwandte Themen