0

我正忙着让我的 xsl 尽可能高效。所以这就是我所拥有的。

<xsl:when test=".//div[starts-with(@class,'ls-col ') or @class='ls-col']">
    <xsl:apply-templates select=".//div[starts-with(@class,'ls-col ') or @class='ls-col']" mode="col"/>
</xsl:when>`

所以这里的逻辑是如果有 ls-col 的 div 存在,应用 mode="col" 的模板。

所以我在想这在我看来是它会评估两次

.//div[starts-with(@class,'ls-col ') or @class='ls-col']

有没有办法保存它并在应用模板中使用它。

4

2 回答 2

0

在这种情况下,您实际上并不需要xsl:when 。只需执行xsl:apply-templates

<xsl:apply-templates 
   select=".//div[starts-with(@class,'ls-col ') or @class='ls-col']" mode="col"/>

如果没有匹配的div标签,则xsl:apply-templates将不匹配任何内容,因此此时不会输出任何内容。因此,没有理由事先检查此类标签的存在。

于 2012-09-18T07:55:54.893 回答
0

正如 Tim C 所说,如果它是一个 xsl:if 当条件不成立时,你可以依靠应用模板什么都不做。但如果有一个“否则”分支,只需将条件放入变量中:

<xsl:variable name="c" select=".//div[starts-with(@class,'ls-col ') or @class='ls-col']"/>
<xsl:choose>
<xsl:when test="$c">
    <xsl:apply-templates select="$c" mode="col"/>
</xsl:when>
<xsl:otherwise>...
于 2012-09-18T08:29:40.613 回答