4

私のxsltテンプレートには、for-eachステートメントがあります。その中でfor-each私はさまざまな条件を作っています。に割り当てられるクラス属性を含む文字列型の変数が必要です<li>

私はxsltを初めて使用するので、いくつかの例を教えてください。または、やりたいことをどのように達成できますか。

これが私のコードの一部ですので、私が何をしているのかを見ることができます:

<xsl:if test="count($currentPage/ancestor-or-self::* [@level=$level]/* [@isDoc and string(umbracoNaviHide) != '1']) &gt; '0'">
    <xsl:for-each select="$currentPage/ancestor-or-self::* [@level=$level]/* [@isDoc and string(umbracoNaviHide) != '1']">
        <li><xsl:attribute name="class">
                topNavigLi
                page<xsl:number value="position()" format="1" />
                <xsl:if test="@nodeName='Network' ">
                    has_submenu network
                </xsl:if>
            </xsl:attribute>
            <xsl:if test="@id = $currentPage/@id">
                <xsl:attribute name="class">
                    current topNavigLi
                    page<xsl:number value="position()" format="1" />
                </xsl:attribute>
            </xsl:if>
            <xsl:if test="position() = last()">
                <xsl:attribute name="class">
                    last topNavigLi
                    page<xsl:number value="position()" format="1" />
                </xsl:attribute>
            </xsl:if>

            <xsl:if test="@id = $currentPage/@id and position() = last()">
                <xsl:attribute name="class">
                    current last topNavigLi
                    page<xsl:number value="position()" format="1" />
                </xsl:attribute>
            </xsl:if>

変数を持っていて、テストを行っているときにそれに連結するよりもはるかにエレガントです。私はこのように試しましたが、何も返しません。

<xsl:variable name="li_class" select="page"> </xsl:variable>

<xsl:attribute name="class">
    <xsl:value-of select="li_class" /> 
</xsl:attribute>
4

4 に答える 4

8

これは、あなたが求めていると私が思うことを行う例です:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*">
     <xsl:copy>
       <xsl:apply-templates/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="num">
  <xsl:variable name="vResult">

    <xsl:if test=". mod 2 = 0">Even </xsl:if>
    <xsl:if test=". mod 3 = 0"> mult3</xsl:if>
    <xsl:if test="not(. mod 2 = 0 or . mod 3 = 0)">none</xsl:if>
  </xsl:variable>

  <xsl:variable name="vnormResults" select="normalize-space($vResult)"/>

  <num tests="{$vnormResults}">
   <xsl:value-of select="."/>
  </num>
 </xsl:template>
</xsl:stylesheet>

この変換が次の XML ドキュメントに適用される場合:

<nums>
  <num>01</num>
  <num>02</num>
  <num>03</num>
  <num>04</num>
  <num>05</num>
  <num>06</num>
  <num>07</num>
  <num>08</num>
  <num>09</num>
  <num>10</num>
</nums>

結果は次のとおりです。

<nums>
   <num tests="none">01</num>
   <num tests="Even">02</num>
   <num tests="mult3">03</num>
   <num tests="Even">04</num>
   <num tests="none">05</num>
   <num tests="Even mult3">06</num>
   <num tests="none">07</num>
   <num tests="Even">08</num>
   <num tests="mult3">09</num>
   <num tests="Even">10</num>
</nums>
于 2012-07-24T12:18:46.727 に答える
2

'page1'のような文字列を変数に入れて再利用したいと思いますか?

もしそうなら、試してみてください...

           <xsl:for-each select="$currentPage/ancestor-or-self::* [@level=$level]/[@isDoc and string(umbracoNaviHide) != '1']">
                <xsl:variable name="page-num" select="concat('page',position())" /> 
                <li><xsl:attribute name="class">
                        topNavigLi
                        <xsl:value-of select="$page-num" />
                        <xsl:if test="@nodeName='Network' ">
                            has_submenu network
                        </xsl:if>
                    </xsl:attribute>
                    <xsl:if test="@id = $currentPage/@id">
                        <xsl:attribute name="class">
                            current topNavigLi
                            <xsl:value-of select="$page-num" />
                        </xsl:attribute>
                    </xsl:if>
                    <xsl:if test="position() = last()">
                        <xsl:attribute name="class">
                            last topNavigLi
                            page<xsl:number value="position()" format="1" />
                        </xsl:attribute>
                    </xsl:if>

                    <xsl:if test="@id = $currentPage/@id and position() = last()">
                        <xsl:attribute name="class">
                            current last topNavigLi
                            <xsl:value-of select="$page-num" />
                        </xsl:attribute>
                    </xsl:if>

XSLT 1.0では、変数を定義するための構文はここにあります。XSLT2.0の場合はここにあります。XPATHコンテキスト内の変数にアクセスするには、名前の前にドル記号($)を付けます。

于 2012-07-24T12:10:38.703 に答える
2

次のように XSLT で変数の値を取得します ($記号付き):

<xsl:variable name="li_class" select="page"> </xsl:variable>

<xsl:attribute name="class">
    <xsl:value-of select="$li_class" /> 
</xsl:attribute>
于 2012-07-24T12:35:16.273 に答える
2

その間読んだ後、私は次のことを知りました(ただし、ほとんど知っていたことです):

を変更する必要があるという事実は、XSLT で考えていないことを示しています。

XSLT は関数型プログラミング言語であり、とりわけ、変数を変更する方法がないことを意味します。定義上、関数型プログラミング言語の変数は不変です。ソース: http://social.msdn.microsoft.com/Forums/eu/xmlandnetfx/thread/2bf7d238-92d2-4453-a683-4bfb0c667795

そこで、ロジックを少し変更しました。すべての条件を次のように xsl 属性に入れました。

 <xsl:if test="count($currentPage/ancestor-or-self::* [@level=$level]/* [@isDoc and string(umbracoNaviHide) != '1']) &gt; '0'">
            <xsl:for-each select="$currentPage/ancestor-or-self::* [@level=$level]/* [@isDoc and string(umbracoNaviHide) != '1']">
                <li>
                    <xsl:attribute name="class">
                        page topNavigLi page<xsl:number value="position()" format="1" />
                        <xsl:if test="@id = $currentPage/@id">
                            current 
                        </xsl:if>
                        <xsl:if test="position() = last()">
                            last
                        </xsl:if>
                        <xsl:if test="@nodeName='Network' ">
                            has_submenu network
                        </xsl:if>
                    </xsl:attribute>

したがって、余分な一時変数は必要ありません。

于 2012-07-24T12:59:47.117 に答える