XSLT从同一父节点中的子节点中生成表

时间:2018-08-07 08:19:33

标签: xslt html-table

我需要从一个父节点中生成一张表。

已截断的XML如下:

<persons>
    <name>John</name>
    <age>30</age>
    <city>London</city>
    <name>Jake</name>
    <age>28</age>
    <city>New York</city>
</persons>

但是有时看起来可能像这样:

<persons>
    <name>John</name>
    <age>30</age>
    <name>Jake</name>
    <age>28</age>
</persons>

在两种情况下,生成的表应看起来相同,如下所示:

<table>
    <tbody>
        <tr>
            <th>Name</th>
            <th>Age</th>
            <th>City</th>
        </tr>
        <tr>
            <td>John</td>
            <td>30</td>
            <td>London</td>
        </tr>
        <tr>
            <td>Jake</td>
            <td>28</td>
            <td>New York</td>
        </tr>
    </tbody>
</table>

或者在其他情况下:

<table>
    <tbody>
        <tr>
            <th>Name</th>
            <th>Age</th>
            <th>City</th>
        </tr>
        <tr>
            <td>John</td>
            <td>30</td>
            <td></td>
        </tr>
        <tr>
            <td>Jake</td>
            <td>28</td>
            <td></td>
        </tr>
    </tbody>
</table>

我知道<persons>中可以包含哪些标签。 但是我不知道如何在xslt中做到这一点。

1 个答案:

答案 0 :(得分:1)

在使用XSLT 2.0时,您可以为此使用xsl:for-each-group构造,因此,您将以name元素开头的元素分组

尝试此XSLT。假设name将始终存在,并且是组中的第一个元素。 agecity不必出现。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output method="html" indent="yes" html-version="5"/>

  <xsl:template match="persons">
    <table>
      <tr>
        <th>Name</th>
        <th>Age</th>
        <th>City</th>
      </tr>
      <xsl:for-each-group select="*" group-starting-with="name">
        <tr>
          <td><xsl:value-of select="." /></td>
          <td><xsl:value-of select="current-group()[self::age]" /></td>
          <td><xsl:value-of select="current-group()[self::city]" /></td>
        </tr>
      </xsl:for-each-group>
    </table>
  </xsl:template>
</xsl:stylesheet>