xsl 1.0将元素拆分为两个不同的表

时间:2014-12-15 09:57:55

标签: xml xslt xslt-1.0

您好我是XSLT编程的新手,我使用的是XSLT 1.0版本 我有xml文件,我想转移到HTML表。 问题是如何将带有元素的节点复制到另一个表中?

这是XML输入

<root>    
    <element>
        <id> 1 </id>
        <data> aa </data>
    </element>

    <element>
        <id> 2 </id>
        <err> y </err>
        <data> bb </data>

    </element>

    <element>
        <id> 3 </id>
        <data> cc </data>
    </element>

    <element>
        <id> 4 </id>
        <err> x </err>
        <data> dd </data>
    </element>
</root>

这是预期的输出:

<table>
    <thead>
        <th> ID </th>
        <th> Error </th>
    </thead>
    <tbody>
        <tr>
            <td> 2 </td>
            <td> y </td>
        </tr>
        <tr>
            <td> 4 </td>
            <td> x </td>
        </tr>
    </tbody>
</table>

<table>
    <thead>
        <th> ID </th>
        <th> Data </th>
    </thead>
    <tbody>
        <tr>
            <td> 1 </td>
            <td> aa </td>
        </tr>
        <tr>
            <td> 2 </td>
            <td> bb </td>
        </tr>
        <tr>
            <td> 3 </td>
            <td> aa </td>
        </tr>
        <tr>
            <td> 4 </td>
            <td> bb </td>
        </tr>
    </tbody>
</table>

我正在使用XSLT 1.0 有什么建议?

1 个答案:

答案 0 :(得分:1)

这是一个简单但虽然冗长的方式:

XSLT 1.0

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

<xsl:template match="/">
    <root>
        <table>
            <thead>
                <th>ID</th>
                <th>Error</th>
            </thead>
            <tbody>
                <xsl:for-each select="root/element[err]">
                    <tr>
                        <td><xsl:value-of select="id"/></td>
                        <td><xsl:value-of select="err"/></td>
                    </tr>
                </xsl:for-each>
            </tbody>
        </table>                
        <table>
            <thead>
                <th>ID</th>
                <th>Data</th>
            </thead>
            <tbody>
                <xsl:for-each select="root/element">
                    <tr>
                        <td><xsl:value-of select="id"/></td>
                        <td><xsl:value-of select="data"/></td>
                    </tr>
                </xsl:for-each>
            </tbody>
        </table>                
    </root>
</xsl:template>

</xsl:stylesheet>

这是一种更聪明的方式:

XSLT 1.0

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

<xsl:template match="/">
    <root>
        <table>
            <thead>
                <th>ID</th>
                <th>Error</th>
            </thead>
            <tbody>
                <xsl:apply-templates select="root/element/err"/>
            </tbody>
        </table>                
        <table>
            <thead>
                <th>ID</th>
                <th>Data</th>
            </thead>
            <tbody>
                <xsl:apply-templates select="root/element/data"/>
            </tbody>
        </table>                
    </root>
</xsl:template>

<xsl:template match="err|data">
    <tr>
        <td><xsl:value-of select="../id"/></td>
        <td><xsl:value-of select="."/></td>
    </tr>
</xsl:template>

</xsl:stylesheet>

上面假设格式正确的输入,其根元素名为<root>