我的xml中有这个结构:
<zoo>
<species name="bird" />
<animal name="crane" />
<animal name="duck" />
<species name="fish" />
<animal name="dolphin" />
<animal name="goldfish" />
</zoo>
我希望转换成这样的东西:
<table>
<tr><td> <b>bird</b> </td></tr>
<tr><td> crane </td></tr>
<tr><td> duck </td></tr>
</table>
<table>
<tr><td> <b>fish</b> </td></tr>
<tr><td> dolphin </td></tr>
<tr><td> goldfish </td></tr>
</table>
我该如何使这项工作?我尝试使用嵌套的for:each
'es,但由于节点没有嵌套,这显然不起作用。
答案 0 :(得分:1)
假设像Saxon 9或XmlPrime这样的XSLT 2.0处理器可以使用for-each-group group-starting-with="species"
:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:template match="/">
<htmt>
<head>
<title>group-starting-with</title>
</head>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="zoo">
<xsl:for-each-group select="*" group-starting-with="species">
<table>
<xsl:apply-templates select="current-group()"/>
</table>
</xsl:for-each-group>
</xsl:template>
<xsl:template match="species">
<tr>
<th>
<xsl:value-of select="@name"/>
</th>
</tr>
</xsl:template>
<xsl:template match="animal">
<tr>
<td><xsl:value-of select="@name"/></td>
</tr>
</xsl:template>
</xsl:transform>