XSLT使用同一父节点中的子节点生成表
我需要从一个父节点生成一个表 被截断的XML如下所示:XSLT使用同一父节点中的子节点生成表,xslt,html-table,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>
<name>John</name>
<age>30</age>
<city>London</city>
<name>Jake</name>
<age>28</age>
<city>New York</city>
</persons>
约翰
30
伦敦
满意的
28
纽约
但有时情况可能是这样的:
<persons>
<name>John</name>
<age>30</age>
<name>Jake</name>
<age>28</age>
</persons>
约翰
30
满意的
28
对于这两种情况,生成的表应该是相同的,如下所示:
<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>
名称
年龄
城市
约翰
30
伦敦
满意的
28
纽约
或在另一种情况下:
<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>
名称
年龄
城市
约翰
30
满意的
28
我知道
中可以有哪些标签。
但是我不知道如何在xslt中做到这一点。当您使用XSLT2.0时,您可以使用
xsl:for each group
构造来实现这一点,因此您可以从name
元素开始对元素进行分组
试试这个XSLT。这假定name
始终存在,并且是组中的第一个元素<代码>年龄和城市不需要出现
<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>
名称
年龄
城市
您知道可以使用哪个版本的XSLT吗?我使用的是版本2。0@Filburt是的,这很奇怪,但我不能改变它,所以我必须找到解决办法。。。如果有一个元素,name
标签是否会始终为每个人提供?@TimC是的,它将始终提供谢谢!如何为每个标记应用模板?我试图用xsl:apply templates
替换xsl:value of
,但它只适用于select=“”。
您需要澄清问题所在。请参阅使用xsl:apply-templates
的示例,这正是我所怀疑的。但是在我的模板中,它应用了两次age
和city
模板。因此有30年28年
和伦敦纽约
。你知道为什么吗?代码应该完全相同,只是标记名不同。如果看不到代码,就不可能回答。我想你可能想问一个新问题。感谢名称空间的前缀似乎是问题所在。我试着把它修好。如果我找不到解决办法,我会问另一个问题。非常感谢你!