2014-07-11 71 views
1

得到數組元素我有XSLT:XSLT通過ID

<xsl:template match="/"> 
    <!--<FLC_OKVEDCODE>--> 
    <xsl:variable name="valArray" select="//NodeA | //NodeB | //NodeC"/> 
    <xsl:variable name="valResArray"> 
     <result_value>TextA</result_value> 
     <result_value>TextB</result_value> 
     <result_value>TextC</result_value> 
    </xsl:variable> 
    <xsl:variable name="resArray" select="document('')//xsl:variable[@name= 'valResArray']/*"></xsl:variable> 

    <xsl:for-each select="$valArray"> 
     <xsl:if test="string-length(normalize-space(text())) = 0"> 
      <ERROR> 
       <Err1><xsl:value-of select="position()"></xsl:value-of></Err1> 
       <Err2><xsl:value-of select="$resArray[1]"></xsl:value-of></Err2> 
       <Err3><xsl:value-of select="$resArray[2]"></xsl:value-of></Err3> 
       <Err4><xsl:value-of select="$resArray[3]"></xsl:value-of></Err4> 
       <Err5><xsl:value-of select="$resArray[position()]"></xsl:value-of></Err5> 
      </ERROR> 
     </xsl:if> 
    </xsl:for-each> 
    <!--</FLC_>--> 
</xsl:template> 

它必須檢查NodeA上,NodeB和NODEC如果它們是空的 - 創建錯誤XML。在我的測試節點B是空的,但結果是:

<ERROR> 
    <Err1>2</Err1> 
    <Err2>TextA</Err2> 
    <Err3>TextB</Err3> 
    <Err4>TextC</Err4> 
    <Err5>TextA</Err5> 
</ERROR> 

爲什麼Err5是TEXTA,如果位置()的返回2和$ resArray [2](在印刷)是TEXTB ??

回答

1

之後問題吃了我的大腦,解決方案很簡單:

添加:

<xsl:variable name="temppos" select="position()"></xsl:variable> 
ERR4和Err5之間

。它看起來像它會自動將數組作爲「位置」等函數的參數,並使用最接近的數組進行操作。所以,「resArray」的「position()」仍然是1,這就是爲什麼會有這個結果。

這是我猜測的解釋。但是,我仍然對在XSLT中處理數組感到失望。

+1

問題是謂詞改變了上下文 - $ resarray [position()]在'$ resarray'中的每個節點的上下文中評估'position()'謂詞一次,而你想要做的是捕獲_outer_上下文中的'position()'值('for-each')並在謂詞中使用該值。正如你發現的,最簡單的方法是使用一個變量。 –

+2

數值謂詞'[N]'等同於[[position()= N]',所以'[position()]'意味着[[position()= position()]'總是爲真。 –

2

爲什麼Err5是TEXTA,如果位置()返回2

爲什麼你認爲那個位置()返回2?事實是,表達式:

$resArray[position()] 

指「具有非零(即真實)位置 $ resArray的所有節點」。這是所有 $ resArray的節點。

因此表達式:

<xsl:value-of select="$resArray[position()]"/> 

將返回的第一節點的值返回的節點集(即TextA)在XSLT 1.0,並且所有匹配的節點的值(即TextA TextB TextC)在XSLT 2.0中。

+0

因爲上面3行的「position()」返回2.我需要可迭代數組的位置,但不知道如何解決它,在哪裏讀取它等。 – Arkady

+0

@Arkady這不是它的工作原理。謂詞中的position()是被測節點的位置。例如,如果您嘗試'$ resArray [position()= 2]',則可以看到此內容。 –