2011-11-17 117 views
1

我有以下定義一個變量參考變量或參數「數據類型」的值必須爲節點列表

<xsl:variable name="DataType" select="@DataType"/> 

這工作得很好......

現在我想將其值設置使用類似的條件這

<xsl:variable name="DataTypeOverrideType" select="$DataSource/@DataTypeOverrideType"/> 
<xsl:variable name="DataType"> 
    <xsl:choose> 
     <xsl:when test="$ObeyTypeOverride and $DataTypeOverride = 1"> 
      <xsl:value-of select="$DataTypeOverrideType"/> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="@DataType"/>  
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 

但我; M得到以下錯誤:

參考變量或參數「數據類型」的值必須爲節點列表

我也試過最簡單的例子,像這樣

<xsl:variable name="DataType"> 
    <xsl:value-of select="@DataType"/>  
</xsl:variable> 

,但我不斷收到錯誤:|

的變化我沒有到確定我想要使用它的變量,這樣

<xsl:when test="$DataType = 'ReachEdit'"> 

的方式後,像這樣

<xsl:when test="$DataType = 9"> 

我如何能解決任何想法這個問題?提前

謝謝!

+0

好問題(但你仍然可能提供更多數據)+1。似乎您希望在兩個節點之間進行條件選擇 - 這可以使用單個XPath表達式完成,並且不需要使用任何XSLT條件指令。 –

+0

好,問題重新編輯... – Daniel

+0

謝謝,使用建議XPath函數,字符串($ DataType)='ReachEdit'和數字($ DataType)= 9,它的工作原理 – Daniel

回答

2

這個錯誤是由於您定義了一個具有RTF(Result-Tree-Fragment)類型的變量。爲了將此變量的內容用作常規樹,必須先使用xxx:node-set()擴展函數將其轉換爲常規樹,其中前綴"xxx:"必須綁定到實現(供應商提供的)名稱空間。

此外,所提供的代碼片段沒有意義

<xsl:variable name="DataType"> 
    <xsl:choose> 
     <xsl:when test="$ObeyTypeOverride and $DataTypeOverride = 1"> 
      <xsl:value-of select="@DataType"/> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="@DataType"/>  
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 

以上述相同的值這兩種情況下是輸出!

我的猜測是,你想是這樣的

<xsl:variable name="DataType"> 
    <xsl:choose> 
     <xsl:when test="$ObeyTypeOverride and $DataTypeOverride = 1"> 
      <xsl:value-of select="@DataType1"/> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="@DataType2"/>  
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 

在這種情況下,XPath 1.0中可以定義變量,而無需創建一個RTF

<xsl:variable name="DataType" select= 
    "@DataType1[$ObeyTypeOverride and $DataTypeOverride = 1] 
    | 
    @DataType2[not($ObeyTypeOverride and $DataTypeOverride = 1)] 
" /> 

更新:問題現在用更正後的片段和變量的實際用法示例更新,這會導致錯誤m essage。

隨着變量被用作原子值,該錯誤信息不應該被提出如果使用以下XPath表達式:

string($DataType) = 'ReachEdit' 

number($DataType) = 9 
+0

I重新編輯這個問題......希望現在會更清楚,Tx – Daniel

+0

@Daniel:好的,你可以在比較中使用:'string($ DataType)='ReachEdit',並相應地:'number($ DataType)= 9' –

+0

@Daniel:我已經相應地更新了我的答案。 –

1

嗯,我不認爲你會得到錯誤消息「引用變量或參數...必須評估到一個節點列表」作爲您發佈的代碼片段,因爲您可以設置變量。然而,這個變量是一個結果樹片段,只有一個文本子節點,而不是節點集。所以我後來懷疑你嘗試類似<xsl:apply-templates select="$DataType"/><xsl:for-each select="$DataType">...</xsl:for-each>,然後你得到錯誤。

這是很難提出一個解決方案爲您的片斷

<xsl:variable name="DataType"> 
    <xsl:choose> 
     <xsl:when test="$ObeyTypeOverride and $DataTypeOverride = 1"> 
      <xsl:value-of select="@DataType"/> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="@DataType"/>  
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 

在邏輯上並沒有多大的意義對我來說,無論是whenotherwisevalue-of select="@DataType"所以我不知道它到底是什麼,你想實現,除了直接做<xsl:variable name="DataType" select="@DataType"/>

因此,您需要更詳細地解釋您想要實現的內容,然後我們可以建議一種解決此問題的XSLT方法。

也許 <xsl:variable name="DataType" select="($DataSource/@DataTypeOverrideType[$ObeyTypeOverride and . = 1] | @DataType)[1]"/>就夠了。

+0

無論何時和否則當相同只是爲了舉例...我編輯了這個問題......並且顯示了後面的用法;我用$ DataType做了 – Daniel

+0

感謝將我指向錯誤的正確位置......(變量的後面用法) – Daniel

相關問題