Как отобразить эти данные XML в табличном формате HTML ..? - PullRequest
3 голосов
/ 24 декабря 2011

Ниже мой XML-файл -

<School>
  <Std c="8">
    <Name>ABC</Name>
    <Age>12</Age>
    <Name>EFG</Name>
    <Age>11</Age>
    <Name>PQR</Name>
    <Age>12</Age>
    <Name>XYZ</Name>
    <Age>11</Age>
  </Std>
</School>

Я хочу вывод HTML как -

Name    Age
ABC     12 
EFG     11
PQR     12
XYZ     11

Ответы [ 3 ]

6 голосов
/ 24 декабря 2011

Вот полностью универсальное решение, которое работает с любым количеством столбцов :

<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:key name="kColsByName" match="Std/*"
  use="name()"/>

 <xsl:variable name="vCols" select=
  "*/*/*
        [generate-id()
        =
        generate-id(key('kColsByName', name())[1])
        ]
  "/>

 <xsl:variable name="vNumCols" select="count($vCols)"/>

 <xsl:template match="/*/Std">
     <table>
      <tr>
        <xsl:apply-templates select="$vCols"
             mode="head"/>
      </tr>
      <xsl:apply-templates select=
       "*[position() mod $vNumCols = 1]"/>
     </table>
 </xsl:template>

 <xsl:template match="Std/*" mode="head">
  <th><xsl:value-of select="name()"/></th>
 </xsl:template>

 <xsl:template match="Std/*">
  <tr>
   <xsl:apply-templates mode="inrow" select=
    "(. | following-sibling::*)
         [not(position() > $vNumCols)]"/>
  </tr>
 </xsl:template>

  <xsl:template match="Std/*" mode="inrow">
  <td><xsl:value-of select="."/></td>
 </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к предоставленному документу XML :

<School>
  <Std c="8">
    <Name>ABC</Name>
    <Age>12</Age>
    <Name>EFG</Name>
    <Age>11</Age>
    <Name>PQR</Name>
    <Age>12</Age>
    <Name>XYZ</Name>
    <Age>11</Age>
  </Std>
</School>

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

<table>
   <tr>
      <th>Name</th>
      <th>Age</th>
   </tr>
   <tr>
      <td>ABC</td>
      <td>12</td>
   </tr>
   <tr>
      <td>EFG</td>
      <td>11</td>
   </tr>
   <tr>
      <td>PQR</td>
      <td>12</td>
   </tr>
   <tr>
      <td>XYZ</td>
      <td>11</td>
   </tr>
</table>

Теперь, если мы добавим новый столбец, скажем Sex, в исходный документ XML :

<School>
  <Std c="8">
    <Name>ABC</Name>
    <Age>12</Age>
    <Sex>M</Sex>
    <Name>EFG</Name>
    <Age>11</Age>
    <Sex>F</Sex>
    <Name>PQR</Name>
    <Age>12</Age>
    <Sex>F</Sex>
    <Name>XYZ</Name>
    <Age>11</Age>
    <Sex>M</Sex>
  </Std>
</School>

мы можем применить то же преобразование выше без каких-либо модификаций, и оно снова дает правильный результат - это показывает, что преобразование действительно универсально :

<table>
   <tr>
      <th>Name</th>
      <th>Age</th>
      <th>Sex</th>
   </tr>
   <tr>
      <td>ABC</td>
      <td>12</td>
      <td>M</td>
   </tr>
   <tr>
      <td>EFG</td>
      <td>11</td>
      <td>F</td>
   </tr>
   <tr>
      <td>PQR</td>
      <td>12</td>
      <td>F</td>
   </tr>
   <tr>
      <td>XYZ</td>
      <td>11</td>
      <td>M</td>
   </tr>
</table>
2 голосов
/ 24 декабря 2011
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="html" indent="yes"/>

<xsl:template match="School">
<table>
  <tr>
    <th>Name</th>
    <th>Age</th>
  </tr>
  <xsl:for-each select="Std/Name">
    <tr>
      <td>
        <xsl:value-of select="."/>
      </td>
      <td>
        <xsl:value-of select="following::Age"/>
      </td>
    </tr>
  </xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
0 голосов
/ 24 декабря 2011

http://p2p.wrox.com/xslt/66523-create-generic-xsl-template-create-table.html

этот xslt создает общую таблицу:

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

  <xsl:output method="html" indent="yes"/>

  <xsl:template match="/*">
    <table border="1" >
      <thead >
        <tr bgcolor="red">
          <xsl:apply-templates select="*[1]/*" mode="th"/>
        </tr>
      </thead>
      <tbody>
        <xsl:apply-templates select="*"/>
      </tbody>
    </table>
  </xsl:template>

  <xsl:template match="/*/*/*" mode="th">
    <th>
      <xsl:value-of select="name()"/>
    </th>
  </xsl:template>

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

  <xsl:template match="/*/*/*">
    <td>
      <xsl:value-of select="."/>
    </td>
  </xsl:template>

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