2012-09-12 70 views
1

我需要翻轉兩個節點的元素。最初的變量被設置使用下面的命令:XSLT選擇值和變量select之間的區別

<xsl:variable name="matchesLeft" select="$questionObject/descendant::simpleMatchSet[position()=1]/simpleAssociableChoice"/> 
    <xsl:variable name="matchesRight" select="$questionObject/descendant::simpleMatchSet[position()=2]/simpleAssociableChoice"/> 

我現在想用下面的代碼翻轉變量:

<xsl:variable name="matchesRight"> 
     <xsl:choose> 
      <xsl:when test="$flippedQuestions='true'"> 
       <xsl:value-of select="$questionObject/descendant::simpleMatchSet[position()=2]/simpleAssociableChoice"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="$questionObject/descendant::simpleMatchSet[position()=1]/simpleAssociableChoice"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 

但它只能從第一個元素的值,而不是所有元素在節點中。我怎樣才能做到這一點?

+0

嘗試複製而不是價值 – Jost

+0

複製也不起作用,因爲我無法使用xsl:每個它。 – DanielderGrosse

回答

0

使用

<xsl:variable name="matchesRight" select= 
"$questionObject/descendant::simpleMatchSet 
            [1+($flippedQuestions='true')] 
              /simpleAssociableChoice"/> 

說明

在XPath每當一個布爾值$someBVal被傳遞給一個數字操作者如+,布爾轉換爲數量(0或1)使用number($someBVal)

根據定義:

number(false()) = 0 

number(true()) = 1 

因此

1+($flippedQuestions='true') 

的計算結果爲1,如果的flippedQuestions字符串值是不是字符串"true"和相同的表達式的計算結果如果字符串值flippedQuestions是s,則爲2特林"true"

+0

我需要的位置()= 2和位置()= 1我可以結合呢? – DanielderGrosse

+0

@DanielderGrosse,我不明白你在說什麼。必須選擇什麼節點?問題中的代碼使用'xsl:choose',它總是複製兩個選項中的一個。如果你需要選擇*兩個*節點,那麼你根本不需要檢查任何條件。 –

+0

對不起,發表令人困惑的評論。你是解釋給我的答案。非常感謝。 – DanielderGrosse

2

問題是,xsl:variable/@ select爲您提供節點集,但xsl:value-將節點集轉換爲其字符串值。你想要節點集。在XSLT 1.0中,帶有內容的xsl:變量將始終爲您提供結果樹分段;但是在選擇屬性中,您只能使用沒有條件表達式的XPath 1.0。

當然,最好的解決方案是轉移到解決所有這些問題的XSLT 2.0。與1.0保持一致的有效原因的數量正在減少。如果你不得不忍受1.0,那麼在XPath 1.0中存在複雜的變通方法,因爲沒有條件表達式,比如Dimitre所顯示的變量。

+0

感謝您的解釋。現在我也知道我爲什麼不工作。 – DanielderGrosse