我需要从一个父节点中生成一张表。
已截断的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中做到这一点。
答案 0 :(得分:1)
在使用XSLT 2.0时,您可以为此使用xsl:for-each-group
构造,因此,您将以name
元素开头的元素分组
尝试此XSLT。假设name
将始终存在,并且是组中的第一个元素。 age
和city
不必出现。
<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>