Простая таблица XML в HTML - PullRequest
2 голосов
/ 11 июля 2011

У меня есть XML-файл, подобный следующему:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<mylist name="test">
    <title>--$title$- not found</title>
    <table>
        <header>
            <col name="firstname"      title="--$firstname$- not found"/>
            <col name="lastname"      title="--$lastname$- not found"/>
            <col name="country"        title="--$country$- not found"/>
      </header>
            <body>
                <row>
                <col name="firstname">John</col>
                <col name="lastname">Smith</col>
                <col name="country">ENGLAND</col>
              </row>
              <row>
              <col name="firstname">Peter</col>
                <col name="lastname">Scott</col>
                <col name="country">USA</col>
              </row>
        </body>
    </table>
</mylist> 

и мне нужно показать результат в виде таблицы HTML, как показано ниже:

enter image description here

Может кто-нибудь помочь, пожалуйста? Я не в XML / XSL, и мне просто нужно это один раз

Ответы [ 4 ]

5 голосов
/ 11 июля 2011

Попробуйте это:

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

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

  <xsl:template match="title">
    <head>
      <title><xsl:value-of select="." /></title>
    </head>
  </xsl:template>

  <xsl:template match="table">
    <table style="border: 1px solid black">
      <xsl:apply-templates />
    </table>
  </xsl:template>

  <xsl:template match="header">
    <thead>
      <tr>
        <xsl:apply-templates />
      </tr>
    </thead>
  </xsl:template>

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

  <xsl:template match="row">
    <tr>
      <xsl:apply-templates />
    </tr>
  </xsl:template>

  <xsl:template match="col[parent::header]">
    <th style="border: solid black 1px;"><xsl:value-of select="@name" /></th>
  </xsl:template>

  <xsl:template match="col[parent::row]">
    <td style="border: solid black 1px;"><xsl:value-of select="." /></td>
  </xsl:template>
</xsl:stylesheet>

На самом деле он будет помещать атрибут стиля на каждый <td> или <th>, что означает, что выходные данные немного многословны, но он делает XSLT красивым и простым.

1 голос
/ 11 июля 2011

Это более короткое преобразование дает желаемый результат, даже если элементы col в body расположены не в правильном порядке :

-

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:variable name="vColNames">
  <xsl:text>|</xsl:text>
  <xsl:for-each select="/*/*/header/col">
    <xsl:value-of select="concat(@name, '|')"/>
   </xsl:for-each>
 </xsl:variable>

 <xsl:template match="table">
     <table border="1">
      <xsl:apply-templates/>
     </table>
 </xsl:template>

 <xsl:template match="header">
  <thead>
   <tr>
    <xsl:apply-templates/>
   </tr>
  </thead>
 </xsl:template>

 <xsl:template match="header/col">
  <td><xsl:value-of select="@name"/></td>
 </xsl:template>

 <xsl:template match="body/row">
  <tr>
   <xsl:apply-templates select=
    "col[contains($vColNames,concat('|',@name, '|'))]">
     <xsl:sort select=
     "string-length(substring-before($vColNames, @name))"/>
   </xsl:apply-templates>
  </tr>
 </xsl:template>

 <xsl:template match="col">
  <td><xsl:value-of select="."/></td>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

-

При применении к этому документу (по сути, предоставленный документ XML, но элементы col в body находятся в смешанном порядке):

-

<mylist name="test">
    <title>--$title$- not found</title>
    <table>
        <header>
            <col name="firstname"      title="--$firstname$- not found"/>
            <col name="lastname"      title="--$lastname$- not found"/>
            <col name="country"        title="--$country$- not found"/>
        </header>
        <body>
            <row>
                <col name="lastname">Smith</col>
                <col name="firstname">John</col>
                <col name="country">ENGLAND</col>
            </row>
            <row>
                <col name="country">USA</col>
                <col name="firstname">Peter</col>
                <col name="lastname">Scott</col>
            </row>
        </body>
    </table>
</mylist>

желаемый, правильный результат получается :

-

<table border="1">
   <thead>
      <tr>
         <td>firstname</td>
         <td>lastname</td>
         <td>country</td>
      </tr>
   </thead>
   <tr>
      <td>John</td>
      <td>Smith</td>
      <td>ENGLAND</td>
   </tr>
   <tr>
      <td>Peter</td>
      <td>Scott</td>
      <td>USA</td>
   </tr>
</table>
0 голосов
/ 11 июля 2011

Вы имеете в виду XSL?

Я бы по возможности избегал XSL и использовал бы ваш любимый язык программирования, FreeMarker или, возможно, оба.

0 голосов
/ 11 июля 2011

Это может звучать немного странно ... но как насчет текстового редактора с функцией поиска и замены?

XSL - самое лучшее решение, поскольку именно для этого оно и было построено.

Если вы занимаетесь сценариями, то у groovy хорошая обработка XML и, возможно, вы сможете найти решение для вас

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...