XSL在同一级别上组合了两个循环

时间:2015-07-21 16:06:02

标签: xslt xslt-2.0

我的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,但由于节点没有嵌套,这显然不起作用。

1 个答案:

答案 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>

http://xsltransform.net/nc4NzRc/1在线。