2013-09-13 4 views
2

Я пытаюсь проанализировать XML-файл и поместить узлы в горизонтальном порядке; однако, поскольку мой уровень (очень) новичок, все мои подходы не удались; что я мог бы достичь, это «нормальная» таблица со всеми элементами xml.xml/xslt разбор таблицы раскладки

файлы 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> 
+0

Вместо того, чтобы просто ссылаться на файлы, пожалуйста, не могли бы вы отредактировать свой вопрос, чтобы включить подходящий образец ввода, ваш текущий 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> 

Более элегантное (то есть вообще) решение требует двухэтапного процесса, в котором вы построить матрицу значений, а затем отобразить матрицу.

+0

Не могли бы вы рассказать о матричной вещи? спасибо – quaie

+0

Я не думаю, что вам нужна матрица, так как код правильно создает матрицу (моя ошибка). Я провела пару тестов. Вышеприведенный код будет работать правильно, даже если у вас нет элемента, прикрепленного к одному из узлов. Вы можете проверить для себя (временно) удаление «osver» с одного из узлов и увидеть, что вы получаете пустую ячейку. Вам понадобится матрица, если вам нужно решение, которое не подключалось в ожидаемых строках, например 'disk' и' osver'. Пока они явно выбраны, матрица будет правильно создана. –

+0

странно, похоже, что он не работает на http://www.xmlplayground.com/uPLmzm – quaie

Смежные вопросы