如何理解这个xsl模板选择

时间:2013-07-02 04:40:47

标签: html xslt xslt-1.0

如何理解这个代码块,

<xsl:for-each select="testsuite">
  <xsl:apply-templates select="."/>
</xsl:for-each>

在下面使用,

<xsl:template match="testsuites">
    <table border="1" width="100%">
    <tr bgcolor="#9acd32">
      <th align="left">module</th>
      <th align="left">tests</th>
      <th align="left">time</th>
    </tr>
    <tr>
      <td><xsl:value-of select="@name"/></td>
      <td><xsl:value-of select="@tests"/></td>
      <td><xsl:value-of select="@time"/></td>
    </tr>
    </table>
    <br/>

    <xsl:for-each select="testsuite">
      <xsl:apply-templates select="."/>
    </xsl:for-each>
</xsl:template>

根据上述代码,<xsl:apply-templates/>适用的模板是什么? 你能对这个问题提出任何线索吗?

我会高度评价你的帮助。

2 个答案:

答案 0 :(得分:3)

正如hr_117所示,出于所有实际目的,代码

<xsl:for-each select="testsuite">
  <xsl:apply-templates select="."/>
</xsl:for-each>

相当于

<xsl:apply-templates select="testsuite"/>

它实际上不是100%等效,所以在重写之前要小心谨慎:在第一种情况下,在所选模板中对position()的调用将始终返回1,而在第二种情况下,它将返回位置兄弟测试元素中的测试套件。然而,这不太重要。

答案 1 :(得分:1)

<xsl:for-each select="testsuite">语句迭代当前节点的所有子节点(testsuites <xsl:apply-templates select="."/>内的for-each将“触发”testsuite模板(未显示)。

因此,这会调用testsuite模板(适用于儿童testsuite)。 如果testsuite个节点内存在testsuites个节点,则只会执行此操作。

同样不需要for-each <xsl:apply-templates select="testsuite"/>也会这样做。