XSL 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有什么建议吗?

这是一个简单但冗长的方法:

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> 的根元素。

相关内容

  • 没有找到相关文章

最新更新