我有一个xsl,看起来像:
<xsl:param name="relativeURL"/>
<xsl:param name="isPersonalPage" />
<xsl:template match="/">
<xsl:call-template name="main_level" >
<xsl:with-param name="urlMatched" select="siteMap/siteMapNode/siteMapNode/@url= $relativeURL" />
</xsl:call-template>
</xsl:template>
<xsl:template name="main_level" match="/">
<div>
<xsl:param name="urlMatched" />
<xsl:for-each select="siteMap/siteMapNode/siteMapNode">
<xsl:choose>
<xsl:when test="(@url = $relativeURL)">
<a class="top_link active">
<xsl:attribute name="href">
<xsl:value-of select="@url"/>
</xsl:attribute>
<xsl:value-of select="@topNavTitle"/>
</a>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="($isPersonalPage = 'true') and (!($urlMatched))">
<a class="top_link active">
<xsl:attribute name="href">
<xsl:value-of select="@url"/>
</xsl:attribute>
<xsl:value-of select="@topNavTitle"/>
</a>
</xsl:when>
<xsl:otherwise>
<a class="top_link">
<xsl:attribute name="href">
<xsl:value-of select="@url"/>
</xsl:attribute>
<xsl:value-of select="@topNavTitle"/>
</a>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:template>
所以,基本上我需要循环遍历节点,看看任何节点的url属性是否与特定的URL匹配。如果是这样,将变量的值设置为其他东西。然后在被调用的模板“main_nav”中,我希望根据“urlMatched”变量的值做一些事情。 但我不确定我是否可以在两者之间改变变量的值。任何人都可以帮我解决这个问题吗?
答案 0 :(得分:1)
答案 1 :(得分:0)
这不需要for-each
,因为当一侧是节点集时,等于测试的方式。简单地
<xsl:variable name="urlMatched"
select="siteMap/siteMapNode/siteMapNode/@url = $relativeUrl" />
将执行您需要的操作,因为如果左侧集合中的任何节点与右侧的值匹配,则表达式为true,否则为false。您应该可以稍后使用<xsl:if test="$urlMatched">
测试此值。
至于在其他模板中使用值,请记住XSLT中的变量是词法范围的 - 如果要在另一个模板中使用该值,则需要传递参数
<xsl:template name="something">
<xsl:param name="urlMatched" />
<!-- template body here -->
</xsl:template>
...
<xsl:call-template name="something">
<xsl:with-param name="urlMatched"
select="siteMap/siteMapNode/siteMapNode/@url = $relativeUrl" />
</xsl:call-template>
或者只是在被调用模板而不是调用者中进行计算,因为call-template
不会更改上下文,因此相同的select表达式也可以在那里工作。