2011-01-05 3 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> 

Я это XML и Я хочу преобразование XSLT, что перегруппировки что-то вроде этого продукта:Как я могу это сделать?

{продукт 1:
11.11.2011 - 200
16/11/2011 - 290}
{продукт 6
11.11.2011 - 100}

я работать с XSLT 1.0 Asp .net C# XslCompiledTransformation

ответ

1

Использование Muenc hian grouping, как описано здесь: http://www.jenitennison.com/xslt/grouping/index.xml. Если вам нужна помощь в написании кода, укажите, хотите ли вы получать текстовый вывод или вывод HTML в формате, который вы опубликовали.

+0

Очень хорошее спасибо Вам –

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 } 
+0

+1 для бетона информативное решение. –

+0

+1 Хороший ответ. Внутреннее содержимое может начинаться с новой строки (вместо внутренней самой новой строки в правиле 'product'), и таким образом вы избегаете теста позиции. –

+0

@Alejandro, хорошее замечание, спасибо, что заметили. – Flack

Смежные вопросы