使用XSL和XML在动态HTML表中进行行拆分

时间:2015-01-21 21:16:46

标签: xml xslt xslt-1.0

我试图将使用XSL的循环拆分到第二行,但我不确定如何处理此问题。让我告诉你我的代码来解释。

XML

<main>
<book>
    <name>Harry Potter 1</name>
    <pages>347</pages>
    <authors>
        <name>J.K Rowling</name>
        <age>49</age>
    </authors>
    <authors>
        <name>Dan Brown</name>
        <age>59</age>
    </authors>
</book>
<book>
    <name>Harry Potter 2</name>
    <pages>800</pages>
    <authors>
        <name>J.K Rowling</name>
        <age>49</age>
    </authors>
    <authors>
        <name>Barack Obama</name>
        <age>40</age>
    </authors>
</book>

XSL

<table class="table table-bordered" border="1">
<xsl:for-each select="main/book">
    <tr>
        <td><xsl:value-of select="name" /></td>
        <td><xsl:value-of select="pages" /></td>
    </tr>
    <tr>
        <xsl:for-each select="./authors">
            <td><xsl:value-of select="name" /></td>
            <td><xsl:value-of select="age" /></td>
        </xsl:for-each>
    </tr>
</xsl:for-each>
</table> 

目前这会产生类似的结果。

enter image description here

我想要完成的是这样的事情

enter image description here

正如你所看到的那样,作者并没有彼此堆叠而是彼此相邻。

任何人都可以为我阐明这一点吗?我将不胜感激!谢谢你的阅读。

1 个答案:

答案 0 :(得分:1)

请求的输出似乎没有多大意义(在同一列中混合书籍和作者名称,以及页面数和作者年龄),但可以使用以下方法轻松实现:

<xsl:template match="/">
    <table class="table table-bordered" border="1">
        <xsl:for-each select="main/book">
            <tr>
                <td><xsl:value-of select="name" /></td>
                <td><xsl:value-of select="pages" /></td>
            </tr>   
            <xsl:for-each select="authors">
                <tr>
                    <td><xsl:value-of select="name" /></td>
                    <td><xsl:value-of select="age" /></td>
                </tr>
            </xsl:for-each>
        </xsl:for-each>
    </table> 
</xsl:template>