在XSL中使用基于节点计数的不同模板

时间:2014-08-19 14:29:14

标签: xslt

假设我有带有'book'节点的xml

<book>
etc
</book>

在我的xsl文件中,我有:

<xsl:template match = "book">
bla bla
</xsl:template>

当然,这就像一个魅力。 现在我想使用一个模板,如果我只有一个<book>节点,另一个模板,如果我有10个<book>节点。

这(下面)不起作用(我想因为我在'choose'语句中定义模板)我猜对了吗?我怎么能用这个条件(节点数)

来使用不同的模板(如果不是这样)
<xsl:choose>
<xsl:when test="count(book) = 1">
 template1 defined here
</xsl:when>
<xsl:otherwise>
 template2 defined here
</xsl:otherwise>
</xsl:choose>

2 个答案:

答案 0 :(得分:2)

模板必须是根xsl:stylesheetxsl:transform的直接子项。但是当然你可以在比赛模式中写条件,例如

<xsl:template match="books[count(book) = 10]/book">...</xsl:template>

<xsl:template match="books[count(book) = 1]/book">...</xsl:template>

答案 1 :(得分:1)

您应该为这两种情况定义单独的模板,例如

<xsl:template match="*[count(book) = 1]/book">
  <!-- this is called when there is only one book -->
</xsl:template>

<xsl:template match="book">
  <!-- this is called in all other cases -->
</xsl:template>

在一本书案例中,两个模板&#39;匹配模式可以应用于同一节点,但在这种情况下,&#34;更具体的&#34;模板将获胜(有specific rules来控制优先顺序,但基本上只是一个元素名称的匹配将始终被包含/或方括号中的谓词的匹配所推翻。 / p>