2014-09-22 83 views
0

我已经为此搜索了stackoverflow,但某种程度上没有找到适合我的示例。当谈到xslt时我不是特别熟练。我想改变给定的XML:xslt 1.0按节点属性进行分组并输出为html

<ROOT> 
    <LIST id="1" name="list1"> 
     <ITEM rowNumber="1" data="list1row1" name="firstRow"> 
     </ITEM> 
     <ITEM rowNumber="2" data="list1row2" name="secondRow"> 
     </ITEM> 
     <ITEM rowNumber="3" data="list1row3" name="thirdRow"> 
     </ITEM> 
    </LIST> 
    <LIST id="2" name="list2"> 
     <ITEM rowNumber="1" data="list2row1" name="firstRow"> 
     </ITEM> 
     <ITEM rowNumber="2" data="list2row2" name="secondRow"> 
     </ITEM> 
     <ITEM rowNumber="3" data="list2row3" name="thirdRow"> 
     </ITEM> 
    </LIST> 
    <LIST id="3" name="list3"> 
     <ITEM rowNumber="1" data="list3row1" name="firstRow"> 
     </ITEM> 
     <ITEM rowNumber="2" data="list3row2" name="secondRow"> 
     </ITEM> 
     <ITEM rowNumber="3" data="list3row3" name="thirdRow"> 
     </ITEM> 
    </LIST> 
</ROOT> 

进入这个HTML:

<table> 
    <tr> 
     <td>1</td> 
     <td>firstRow</td> 
     <td id="list1_row1">list1row1</td>   
     <td id="list2_row1">list2row1</td>   
     <td id="list3_row1">list3row1</td> 
    </tr> 
    <tr> 
     <td>2</td> 
     <td>secondRow</td> 
     <td id="list1_row2">list1row2</td>   
     <td id="list2_row2">list2row2</td>   
     <td id="list3_row2">list3row2</td> 
    </tr> 
    <tr> 
     <td>3</td> 
     <td>thirdRow</td> 
     <td id="list1_row3">list1row3</td>   
     <td id="list2_row3">list2row3</td>   
     <td id="list3_row3">list3row3</td> 
    </tr> 
</table> 

所以我想利用所有行,并将它们组合在一起的表行,包含行号,名称细胞和数据。如果rowNumber和name是隐藏的单元格,那就好了。

我想用<xsl:if test="position() = 1">来检查是否显示元数据(行号和名称)。单元格将具有列表名(或id)和行号(因此可以用javascript搜索)的ID。

谢谢您提前提供的所有帮助!

回答

2

假设每个列表具有相同数量的项(即行),尝试这种方式:

XSLT 1.0

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

<xsl:key name="item-by-row" match="ITEM" use="@rowNumber"/> 

<xsl:template match="/"> 
    <table> 
     <xsl:for-each select="ROOT/LIST[1]/ITEM"> 
      <tr> 
       <td><xsl:value-of select="@rowNumber"/></td> 
       <td><xsl:value-of select="@name"/></td> 
       <xsl:for-each select="key('item-by-row', @rowNumber)"> 
        <td id="{../@name}_row{@rowNumber}"><xsl:value-of select="@data"/></td>  
       </xsl:for-each> 
      </tr> 
     </xsl:for-each> 
    </table> 
</xsl:template> 

</xsl:stylesheet> 
+0

作品就像一个魅力。谢谢你,先生!我还使用http://www.xsltcake.com/来帮助我进一步修改这个例子以适应我的情况。 – avidenic 2014-09-23 07:08:16