10

1つの条件環境に応じて複数の変数を割り当てたい。私は1つの変数に対してのみそれを行う方法を知っています:

<xsl:variable name="foo">
    <xsl:choose>
        <xsl:when test="$someCondition">
            <xsl:value-of select="3"/>
        <xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="4711"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:variable>

しかし、同じ条件$ someConditionに応じて2つの変数を割り当てたい場合はどうなりますか?

同じxsl:chooseステートメントを再度記述したくありません。これは、実際の例では多少時間がかかり、計算量が多いためです。

問題の環境は、exslt拡張機能を備えたlibxslt(xslt 1.0)です。

編集:私が欲しいのは、に似た動作です

if (condition) {
    foo = 1;
    bar = "Fred";
}
else if (...)  {
    foo = 12;
    bar = "ASDD";
}
(... more else ifs...)
else {
    foo = ...;
    bar = "...";
}
4

2 に答える 2

11

あなたができることは、あなたのメイン変数に要素のリストを返すようにすることです。設定する変数ごとに1つ

  <xsl:variable name="all">
     <xsl:choose>
        <xsl:when test="a = 1">
           <a>
              <xsl:value-of select="1"/>
           </a>
           <b>
              <xsl:value-of select="2"/>
           </b>
        </xsl:when>
        <xsl:otherwise>
           <a>
              <xsl:value-of select="3"/>
           </a>
           <b>
              <xsl:value-of select="4"/>
           </b>
        </xsl:otherwise>
     </xsl:choose>
  </xsl:variable>

次に、exslt関数を使用して、これを「ノードセット」に変換し、これを使用して個々の変数を設定できます。

  <xsl:variable name="a" select="exsl:node-set($all)/a"/>
  <xsl:variable name="b" select="exsl:node-set($all)/b"/>

これを機能させるには、XSLTでexslt関数の名前を宣言する必要があることを忘れないでください。

于 2012-09-07T12:37:52.687 に答える
3

しかし、同じ条件 $someCondition に応じて 2 つの変数を割り当てたい場合はどうすればよいでしょうか?

同じ xsl:choose ステートメントを再度記述したくありません。これは、実際の例ではやや長く、計算量が多いためです。

変数の値がノードでないと仮定すると、このコードはそれらを定義するために拡張関数を使用しません。

<xsl:variable name=vAllVars>   
     <xsl:choose> 
        <xsl:when test="$someCondition"> 
            <xsl:value-of select="1|Fred"/> 
        <xsl:when> 
        <xsl:when test="$someCondition2"> 
            <xsl:value-of select="12|ASDD"/> 
        <xsl:when> 
        <xsl:otherwise> 
            <xsl:value-of select="4711|PQR" />
        </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable>   

<xsl:variable name="foo" select="substring-before($vAllVars, '|')"/>
<xsl:variable name="bar" select="substring-after($vAllVars, '|')"/>
于 2012-09-07T12:42:18.910 に答える