0

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

4

2 回答 2

1

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

请参阅此相关问题

更新 xslt 中的变量

于 2013-03-25T09:49:09.403 回答
0

这不需要 a for-each,因为当一侧是节点集时,equals 测试的工作方式。简单地

<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不会改变上下文,所以相同的选择表达式也可以在那里工作。

于 2013-03-25T09:34:35.627 回答