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

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ます。コンテキストは変更されないため、同じselect式がそこでも機能します。

于 2013-03-25T09:34:35.627 に答える