2016-05-20 3 views
0

Я пытаюсь создать часть XHTML из XML и XSLT-файла.XSLT объединяет те же значения в нескольких столбцах

Мне удалось объединить только первый, второй столбцы, но я не могу объединить третий, который должен быть объединен в соответствии с первым, вторым столбцом.

XML код:

<?xml version="1.0" encoding="UTF-8"?> 
<LIST> 
<Row> 
    <TITLE>Empire Burlesque</TITLE> 
    <YEAR>2000</YEAR> 
    <artist>Bob Dylan</artist> 
    <artist1>Bob Dylan1</artist1> 
</Row> 
<Row> 
    <TITLE>Empire Burlesque</TITLE> 
    <YEAR>2000</YEAR> 
    <artist>Bob Dylan</artist> 
    <artist1>Bob Dylanas</artist1> 
</Row> 
<Row> 
    <TITLE>Empire Burlesque</TITLE> 
    <YEAR>2000</YEAR> 
    <artist>Bonnie Tyler</artist> 
    <artist1>Bob Dylan</artist1> 
</Row> 
<Row> 
    <TITLE>Empire Burlesque</TITLE> 
    <YEAR>2000</YEAR> 
    <artist>Bonnie Tyler</artist> 
    <artist1>Bob Dylanas</artist1> 
</Row> 
</LIST> 

XSLT Код:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" /> 

    <xsl:key name="cds" match="Row" use="TITLE" /> 
    <xsl:key name="cds2" match="Row" use="artist" /> 

    <xsl:template match="/"> 
    <html> 
    <body> 
    <h2>My CD Collection</h2> 
    <table border="1"> 
    <tr bgcolor="#9acd32"> 
     <th>Title</th> 
     <th>Year</th> 
     <th>Artist</th> 
     <th>Artist1</th> 
    </tr> 
    <xsl:for-each select="LIST/Row[generate-id() = generate-id(key('cds', TITLE)[1])]" >  
    <tr> 
    <td> 
     <xsl:if test="key('cds', TITLE)[1]"> 
      <xsl:attribute name="rowspan"> 
       <xsl:value-of select="count(key('cds', TITLE))" /> 
      </xsl:attribute> 
     </xsl:if> 
     <xsl:value-of select="TITLE"/> 
    </td>  
    <td> 
     <xsl:if test="key('cds', TITLE)[1]"> 
      <xsl:attribute name="rowspan"> 
       <xsl:value-of select="count(key('cds', TITLE))" /> 
      </xsl:attribute> 
     </xsl:if> 
     <xsl:value-of select="YEAR"/> 
    </td> 
    <td>  
     <xsl:value-of select="artist"/> 
    </td> 
    <td>  
     <xsl:value-of select="artist1"/> 
    </td> 
</tr>  
<xsl:for-each select="key('cds', TITLE)[position() > 1]"> 
<tr> 
    <td> 
     <xsl:value-of select="artist"/> 
    </td> 
    <td> 
     <xsl:value-of select="artist1"/> 
    </td> 
</tr>  
</xsl:for-each> 
    </xsl:for-each> 
    </table> 
    </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 

Мне нужно, что эта таблица выглядит следующим образом:

enter image description here

+0

Из того, что я вижу в ваших входных данных, вы группируете три уровня на 'T itle', 'Year' и' Artist'. Для этого вам нужно иметь уровень вложенности три в ваших циклах for for each. Я могу видеть только два уровня. Итак, я думаю, что это отправная точка. –

ответ

0

Вы определили первый ключ, для группы TITLE правильно, но для второго ключа вы являетесь группой нг по artist в TITLE, так что вам нужно сцепленный ключ

<xsl:key name="cds2" match="Row" use="concat(TITLE,'|',artist)" /> 

Обратите внимание, что символ трубы | может быть любой персонаж на самом деле, только до тех пор, как он не появляется ни в одном из TITLE или artist.

Получение различных TITLE элементов производится в настоящее время:

<xsl:for-each select="LIST/Row[generate-id() = generate-id(key('cds', TITLE)[1])]">  

И, чтобы получить различные artist элементы в этом, то вы делаете это

<xsl:for-each select="key('cds', TITLE)[generate-id() = generate-id(key('cds2', concat(TITLE,'|',artist))[1])]"> 

Попробуйте XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" /> 
    <xsl:key name="cds" match="Row" use="TITLE" /> 
    <xsl:key name="cds2" match="Row" use="concat(TITLE,'|',artist)" /> 

    <xsl:template match="/"> 
    <html> 
    <body> 
    <h2>My CD Collection</h2> 
    <table border="1"> 
    <tr bgcolor="#9acd32"> 
     <th>Title</th> 
     <th>Year</th> 
     <th>Artist</th> 
     <th>Artist1</th> 
    </tr> 
    <xsl:for-each select="LIST/Row[generate-id() = generate-id(key('cds', TITLE)[1])]">  
     <xsl:for-each select="key('cds', TITLE)[generate-id() = generate-id(key('cds2', concat(TITLE,'|',artist))[1])]"> 
     <xsl:variable name="artistPos" select="position()" /> 
     <xsl:for-each select="key('cds2',concat(TITLE,'|',artist))">    
      <tr> 
      <xsl:if test="$artistPos = 1 and position() = 1"> 
      <td rowspan="{count(key('cds', TITLE))}"> 
       <xsl:value-of select="TITLE"/> 
      </td> 
      <td rowspan="{count(key('cds', TITLE))}"> 
       <xsl:value-of select="YEAR"/> 
      </td> 
      </xsl:if> 
      <xsl:if test="position() = 1"> 
      <td rowspan="{count(key('cds2',concat(TITLE,'|',artist)))}">  
       <xsl:value-of select="artist"/> 
      </td> 
      </xsl:if> 
      <td>  
       <xsl:value-of select="artist1"/> 
      </td> 
      </tr>  
     </xsl:for-each> 
     </xsl:for-each> 
    </xsl:for-each> 
    </table> 
    </body> 
    </html> 
    </xsl:template> 
</xsl:stylesheet> 
Смежные вопросы