2016-05-20 12 views
0

XMLとXSLTファイルからXHTMLを作成しようとしています。XSLTは複数の列で同じ値をマージします

私は最初の2番目の列だけをマージすることができましたが、3番目のものをマージすることはできません。最初の2番目の列に従ってマージする必要があります。

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-eachループに3つのネストレベルが必要です。私は2つのレベルしか見ることができません。だから、私はそれが出発点だと思う。 –

答えて

0

あなたが最初のキーを定義しました、 TITLEで正しくグループ化しますが、2番目のキーではグループになりますTITLEartistによってNGので、あなたは、パイプ文字|がちょうど限りそれはTITLEartistのいずれかに表示されていないとして、実際に任意の文字可能性があること連結キー

<xsl:key name="cds2" match="Row" use="concat(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> 
関連する問題