【问题标题】:xml/xslt parsing table layoutxml/xslt 解析表布局
【发布时间】:2013-09-13 08:51:22
【问题描述】:

我正在尝试解析 xml 文件并将节点按水平顺序放置;然而,由于我的水平是(非常)初学者,我所有的方法都失败了;我可以实现的是一个包含所有 xml 元素的“正常”表。

文件是here - xmlplayground

我想要实现的是

PROD | HOST 1| HOST 2 | HOST 3 | HOST 4 |
disk | value | value  | value  | value  |
etc..| ...   |   ...  |   .... | ...    |
INTE | HOST 5| HOST 6 | HOST 7 |
etc..| value | value  | value  |
TEST | HOST 8|
 etc | values|

感谢任何提示;谢谢

#

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="systatus.xsl"?>
<systatus>
<environment name="prod">
  <node name="HOST 1">
    <OS>
         <disk> Total 197G </disk>
         <disk> Use% 29% </disk>
         <ip> 192.168.169.193/24 bond0 </ip>
         <osver> RHEL </osver>
         <kernel> 2.6.32-358.6.1.el6.x86_64 </kernel>
         <TotalMemory> 15939 </TotalMemory>
         <package> java-1.6.0-sun-devel-1.6.0.45-1jpp.1.el6.x86_64 </package>
         <package> tomcat6-el-2.1-api-6.0.24-52.el6_4.noarch </package>
         <package> httpd-2.2.15-26.el6.x86_64 </package>
         <package> java-1.6.0-sun-1.6.0.45-1jpp.1.el6.x86_64 </package>
         <package> java-1.5.0-gcj-1.5.0.0-29.1.el6.x86_64 </package>
         <package> tomcat6-servlet-2.5-api-6.0.24-52.el6_4.noarch </package>
         <package> tomcat6-jsp-2.1-api-6.0.24-52.el6_4.noarch </package>
         <package> tomcat6-lib-6.0.24-52.el6_4.noarch </package>
         <package> httpd-tools-2.2.15-26.el6.x86_64 </package>
         <package> jakarta-commons-httpclient-3.1-0.7.el6_3.x86_64 </package>
         <package> java_cup-0.10k-5.el6.x86_64 </package>
         <package> tomcat6-6.0.24-52.el6_4.noarch </package>
    </OS>
    <App>
         <MinMemory> 4000 </MinMemory>
         <MaxMemory> 8000 </MaxMemory>
         <app_version> 5.5.0 </app_version>
         <module> -rwxr-xr-x  1 root root 618184 Aug  9 12:20 mod_module.so </module>
    </App>
  </node>

.......

和

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="environment">
<html>
<body>
<h2><b><xsl:value-of select="@name" /></b></h2>

<table border="1">

<xsl:for-each select="node">

        <td bgcolor="#9acd32" colspan="2"><b>
        <xsl:value-of select="@name" /></b>
        </td>
        <xsl:for-each select="*/*">
                <tr>
                <td><xsl:value-of select="name(.)"/></td>
                <td><xsl:value-of select="." /></td>
                </tr>
        </xsl:for-each>

</xsl:for-each>



</table>
</body>
</html>
</xsl:template>

</xsl:stylesheet>

【问题讨论】:

  • 您能否编辑您的问题以在问题中包含合适的输入示例、您当前的 XSLT 和所需的内联输出,而不是仅仅链接到文件。

标签: xml xslt


【解决方案1】:

您正在尝试从树结构创建数据透视表,这并不是一件容易的事。我们可以做一个简化的假设,即每个node 都有你想要捕捉的特定细节,这将允许我们做一些蛮力的事情。

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="systatus">
    <html>
    <body>
    <xsl:apply-templates/>
    </body>
    </html>
</xsl:template>

<xsl:template match="environment">
    <xsl:variable name="env">
        <xsl:value-of select="@name" />
    </xsl:variable>
    <h2><xsl:value-of select="$env"/></h2>

    <table border="1">
        <thead>
            <th bgcolor="#9acd32"><xsl:text><xsl:value-of select="$env"/></xsl:text></th>
            <xsl:for-each select="node">
                <th bgcolor="#9acd32">
                <xsl:value-of select="@name" />
                </th>
            </xsl:for-each>
        </thead>
        <tbody>
            <tr>
                <th>Disk</th>
                <xsl:for-each select="node">
                    <td>
                        <xsl:apply-templates select="OS/disk"/>
                    </td>
                </xsl:for-each>
            </tr>
            <tr>
                <th>IP</th>
                <xsl:for-each select="node">
                    <td>
                        <xsl:value-of select="OS/ip"/>
                    </td>
                </xsl:for-each>
            </tr>
            <tr>
                <th>OS Version</th>
                <xsl:for-each select="node">
                    <td>
                        <xsl:apply-templates select="OS/osver"/>
                    </td>
                </xsl:for-each>
            </tr>
            <tr>
                <th>Kernel</th>
                <xsl:for-each select="node">
                    <td>
                        <xsl:apply-templates select="OS/kernel"/>
                    </td>
                </xsl:for-each>
            </tr>
            <tr>
                <th>Total Memory</th>
                <xsl:for-each select="node">
                    <td>
                        <xsl:apply-templates select="OS/TotalMemory"/>
                    </td>
                </xsl:for-each>
            </tr>
        </tbody>
    </table>
</xsl:template>

</xsl:stylesheet>

更优雅(即通用)的解决方案需要一个两阶段的过程,您可以在此过程中构建一个值矩阵,然后显示该矩阵。

【讨论】:

  • 我认为您不需要矩阵,因为代码会正确创建矩阵(我的错误)。我进行了几次测试。即使您没有将元素附加到其中一个节点,上述代码也将正常工作。您可以通过(临时)从其中一个节点中删除 osver 来进行测试,并看到您得到一个空白单元格。如果您想要一个未在预期行中连接的解决方案,您将需要一个矩阵,例如disk 和osver。只要明确选择它们,矩阵就会正确创建。
  • 我对 xmlplayground 不熟悉——您是否更改了代码?还是别人做的?运行测试后,我从 Eclipse 复制并粘贴了上面的代码。
  • 唯一的区别是xmlplayground上的xml是完整的,这里我只粘贴了第一个节点。我会得到 Eclipse 并看穿它。谢谢
猜你喜欢
  • 1970-01-01
  • 2013-03-23
  • 2019-07-17
  • 1970-01-01
  • 2017-01-26
  • 1970-01-01
  • 1970-01-01
  • 2013-06-16
  • 1970-01-01
相关资源
最近更新 更多