我对变量
有以下定义<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">
关于如何解决这个问题的任何想法?
提前致谢!
答案 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>
对我来说逻辑上没有多大意义,when
和otherwise
做value-of select="@DataType"
所以我想知道你想要实现的是什么,而不是直接做<xsl:variable name="DataType" select="@DataType"/>
1}}。
因此,您需要更详细地解释您想要实现的目标,然后我们可以建议一种XSLT解决方法。
[编辑]
也许
<xsl:variable name="DataType" select="($DataSource/@DataTypeOverrideType[$ObeyTypeOverride and . = 1] | @DataType)[1]"/>
就足够了。