2013-01-03 1 views
0

У меня есть XML, как этотПринимая значение сгруппированных elemnts как через запятую внутри для каждого цикла в XSLT

<filters> 
     <ISP_WebItem FILTER="Type" FILTERNAME="Farvet" UNITCODE="" /> 
     <ISP_WebItem FILTER="Antal i pakke" FILTERNAME="1" UNITCODE="Farvepatro" /> 
     <ISP_WebItem FILTER="Farve" FILTERNAME="Rød" UNITCODE="" /> 
     <ISP_WebItem FILTER="Farve" FILTERNAME="Blå" UNITCODE="" /> 
     <ISP_WebItem FILTER="Farve" FILTERNAME="Gul" UNITCODE="" /> 
     <ISP_WebItem FILTER="Printer mærke" FILTERNAME="HP" UNITCODE="" /> 
</filters> 

я хочу, чтобы преобразовать этот XML в к HTML-то вроде этого

Type   = Farvet 
Antal i pakke = 1 
farve   =Rød,Blå,Gul etc 
Printer mærke =HP 

вы можете видеть, что есть три атрибута «FILTER» с одинаковым значением «Farve». В моем HTML I хочу, чтобы они были разделены запятыми. как первый шаг для этого, я сгруппировал элементы этого XML с помощью Muenchian_grouping, так что если два или более атрибута FILTER одинаковы, они будут смежными.

тогда я сделал некоторые вещи, как этот

<xsl:for-each select="$filt-grouped-formatted//ISP_WebItem[position() = 1 or @FILTER != preceding-sibling::*[1]/@FILTER ]"> 
       <xsl:variable name="current_filter" select="@FILTER" /> 
       <tr> 
       <td width="200px"> 
        <xsl:value-of select="$current_filter"/>: 
       </td> 
       <td> 
        <xsl:value-of select="@FILTERNAME"/> 
        <xsl:if test="@UNITCODE != ''"> 
        <xsl:text> </xsl:text> 
        <xsl:value-of select="@UNITCODE"/> 
        </xsl:if> 
        <xsl:variable name="current_grouped_filter" select="$filt-grouped-formatted[@FILTER = $current_filter]" /> 

        <xsl:if test="count($current_grouped_filter) &gt; 0"> 
        <textarea> 
         <xsl:copy-of select="$current_grouped_filter"/> 
        </textarea> 
        <xsl:text>, </xsl:text> 
        <xsl:for-each select="$current_grouped_filter"> 
         <xsl:value-of select="@FILTERNAME"/> 
         <xsl:if test="@UNITCODE != ''"> 
         <xsl:text> </xsl:text> 
         <xsl:value-of select="@UNITCODE"/> 
         </xsl:if> 
       <xsl:if test="count($current_grouped_filter) > position()">,</xsl:if> 
        </xsl:for-each> 
        </xsl:if> 
       </td> 
       </tr> 
      </xsl:for-each> 

Единственное, что я не могу добиться того, сгруппированные элементы не coming.can какой-либо один предложить мне изменить в коде.

ответ

1

Это на самом деле проще сделать это в один шаг, используя existing grouping key, а не группировать первый, а затем преобразование.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
       xmlns:exslt="http://exslt.org/common" 
       exclude-result-prefixes="exslt"> 
    <xsl:strip-space elements="*"/> 
    <xsl:output method="text" /> 
    <xsl:key name="itemByFilter" match="ISP_WebItem" use="@FILTER" /> 

    <xsl:variable name="filt"> 
    <filters> 
     <ISP_WebItem FILTER="Farve" FILTERNAME="Transparent" UNITCODE="" /> 
     <ISP_WebItem FILTER="Antal" FILTERNAME="10" UNITCODE="mapper" /> 
     <ISP_WebItem FILTER="Farve" FILTERNAME="blue" UNITCODE="" /> 
    </filters> 
    </xsl:variable> 

    <xsl:template match="/"> 
    <xsl:for-each select="exslt:node-set($filt)/filters"> 
     <xsl:apply-templates select="ISP_WebItem[ 
     generate-id() = generate-id(key('itemByFilter', @FILTER)[1])]" /> 
    </xsl:for-each> 
    </xsl:template> 

    <xsl:template match="ISP_WebItem"> 
    <xsl:value-of select="@FILTER" /> 
    <xsl:text> = </xsl:text> 
    <xsl:for-each select="key('itemByFilter', @FILTER)"> 
     <xsl:if test="position() &gt; 1">,</xsl:if> 
     <xsl:value-of select="@FILTERNAME" /> 
    </xsl:for-each> 
    <xsl:text>&#10;</xsl:text> 
    </xsl:template> 
</xsl:stylesheet> 
+0

: спасибо за отличную помощь – Athul

0

Необходимость Muenchian_grouping для группировки Проверьте

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xsl:param name="versionParam" select="'1.0'"/> 

    <xsl:key name="groups" match="ISP_WebItem" use="@FILTER" /> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/filters"> 
     <xsl:for-each select="//ISP_WebItem[generate-id() = generate-id(key('groups',@FILTER))]"> 
      <xsl:value-of select="@FILTER"/> = <xsl:value-of select="@FILTERNAME"/> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 
+0

: i я уже сгруппировал это. Теперь мне нужно сделать сгруппированные элементы запятыми. – Athul