对变量或参数'DataType'的引用必须求值为节点列表

时间:2011-11-17 12:49:43

标签: xml xslt xslt-1.0

我对变量

有以下定义
<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>

但是我得到以下错误:

对变量或参数'DataType'的引用必须评估为节点列表

我也尝试过最简单的例子,比如这个

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

但我继续收到错误:|

在改变之后我做了定义变量的方法我试图使用它,就像这个

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

并且喜欢这个

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

关于如何解决这个问题的任何想法?

提前致谢!

2 个答案:

答案 0 :(得分:2)

这是因为您定义了一个具有RTF(结果树片段)类型的变量。为了将此变量的内容用作常规树,必须首先使用xxx:node-set()扩展函数将其转换为常规树,其中前缀"xxx:"必须绑定到实现(供应商 - 提供)namespace。

此外,提供的代码段没有意义

<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)]
" /> 

更新:现在使用更正的代码段和变量实际使用示例更新问题,从而导致出现错误消息。

由于变量用作原子值,如果使用以下XPath表达式,则不应引发错误消息:

string($DataType) = 'ReachEdit'

number($DataType) = 9

答案 1 :(得分: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"/> 1}}。

因此,您需要更详细地解释您想要实现的目标,然后我们可以建议一种XSLT解决方法。

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