如何在xsl-loop中更改变量值

时间:2013-03-25 09:25:10

标签: xml variables xslt param

我有一个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”变量的值做一些事情。 但我不确定我是否可以在两者之间改变变量的值。任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

请记住,变量在XSLT中是只读的。也就是说,您只能将它们设置一次。之后它们是只读的。

查看此相关问题

update the variable in xslt

答案 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表达式也可以在那里工作。