xslt 1.0按节点属性分组并输出为html

时间:2014-09-22 14:24:21

标签: html xml xslt

我已经为此搜索了stackoverflow,但不知何故找不到适合我的示例。对于xslt,我不是特别熟练。我想转换给定的XML:

<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)和行号的ID(因此可以使用javascript搜索它们)。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

假设每个LIST具有完全相同数量的ITEMS(即行),请尝试这种方式:

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>