Xslt 无法从XRTreeFrag强制转换到XNodeSet
我有以下测试代码。。。我正在尝试将节点集作为参数传递。几个小时后,我终于能够将它传递给我的模板 如何将节点集传递给模板:Xslt 无法从XRTreeFrag强制转换到XNodeSet,xslt,param,node-set,Xslt,Param,Node Set,我有以下测试代码。。。我正在尝试将节点集作为参数传递。几个小时后,我终于能够将它传递给我的模板 如何将节点集传递给模板: <xsl:call-template name="listing"> <xsl:with-param name="customData"> <xsl:apply-templates select="exslt:node-set($data)"/> </xsl:with-param> </xs
<xsl:call-template name="listing">
<xsl:with-param name="customData">
<xsl:apply-templates select="exslt:node-set($data)"/>
</xsl:with-param>
</xsl:call-template>
我的模板如何接收它:
<xsl:template name="listing">
<xsl:param name="customData" select="/.."/>
<xsl:variable name="data">
<xsl:choose>
<xsl:when test="not($customData)">
<xsl:value-of select="/data"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$customData"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<textarea><xsl:copy-of select="$data"></xsl:copy-of></textarea>
</xsl:call-template>
如果我用一行设置参数,那么它不会抱怨。。。例如:
<xsl:variable name="data" select="$customData"/>
但当我试着这样设置它时,它就坏了:
<xsl:variable name="data">
<xsl:value-of select="$customData"/>
</xsl:variable>
获取此错误消息:
org.apache.xpath.objects.XRTreeFrag不能强制转换为org.apache.xpath.objects.XNodeSet
我只能在2000年找到另一条线索,谈论类似的问题。。。我需要使用node set$customData/*之类的东西重新设置节点,但我尝试了,结果失败了
编辑:
好的,我可以确认我成功地通过了模板中的节点集。但我仍然无法将其复制到我的变量。。。它一直说它仍然是RTF
<xsl:template name="listing">
<xsl:param name="customData" as="node-set"/>
<!--<xsl:variable name="data" select="/data"/>-->
<xsl:variable name="data">
<xsl:choose>
<xsl:when test="count($customData) != 0">
<xsl:copy-of select="$customData"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="/data"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<textarea><xsl:value-of select="$customData/record[1]"/></textarea>
<textarea><xsl:value-of select="/data/record[1]"/></textarea>
<textarea><xsl:value-of select="$data/record[1]"/></textarea>
</xsl:template>
上面的测试表明,我可以访问$customData和原始/数据,没有任何问题,它们都显示了记录。。。但是美元的数据是乱七八糟的。这意味着从$customData到$data的复制不起作用
我尝试了以下方法,但没有一种有效:
<xsl:copy-of select="$customData"/>
<xsl:value-of select="$customData"/>
<xsl:apply-templates select="exslt:node-set($customData)"/>
<xsl:apply-templates select="exslt:node-set($customData)/data"/>
有什么想法吗?此错误消息来自Xalan,它是XSLT1.0处理器。如果您使用的是Xalan,那么您可能使用的是Java,这意味着完全没有理由不以Saxon的形式迁移到XSLT2.0。您会发现XSLT2.0删除了XSLT1.0的许多限制,这是其中最令人恼火的限制之一
如果有一个很好的理由说明您不能继续使用XSLT 2.0,并且很难想出一个理由,那么可以通过exslt:node set函数的形式解决问题,该函数将结果树片段(即使用子指令定义的变量)转换为文档节点。此错误消息来自Xalan,这是一个XSLT1.0处理器。如果您使用的是Xalan,那么您可能使用的是Java,这意味着完全没有理由不以Saxon的形式迁移到XSLT2.0。您会发现XSLT2.0删除了XSLT1.0的许多限制,这是其中最令人恼火的限制之一
如果有一个很好的理由可以解释为什么您不能继续使用XSLT 2.0,并且很难想出一个理由,那么可以通过exslt:node set函数的形式解决问题,它可以将结果树片段(即使用子指令定义的变量)转换为文档节点。基本上可以使用,而不是使用apply-template,我需要将RTF作为参数传递给模板。这是我让它工作的唯一方法
<xsl:with-param name="data" select="exslt:node-set($customData)"/>
使用此方法,我能够在XSL级别修改数据。这真的很酷,我基本上操作了我想要的数据,然后我重建了root/,然后我将customData传递给我的模板函数
因此,我没有从根目录中读取数据,而是读取自己在XSL中构建的修改数据。使其正常工作,基本上没有使用apply template,而是需要将RTF作为参数传递给模板。这是我让它工作的唯一方法
<xsl:with-param name="data" select="exslt:node-set($customData)"/>
使用此方法,我能够在XSL级别修改数据。这真的很酷,我基本上操作了我想要的数据,然后我重建了root/,然后我将customData传递给我的模板函数
因此,我没有从根目录中读取数据,而是读取自己在XSL中构建的修改数据。使用exslt:node set确实抑制了错误消息org.apache.xpath.objects.XRTreeFrag不能强制转换为org.apache.xpath.objects.XNodeSet
但是,由于某种原因创建的节点集不能用于后续XPath表达式中;至少它似乎不适用于Xalan 2.6.0/XSLT 1.0,因为这样或那样的原因,很多人不得不使用这个版本
有一个简单的解决方案:与其将变量设置为节点集,不如将其设置为XPath表达式。然后,您可以使用dyn:evaluate EXSLT函数来计算变量所持有的XPath表达式
您的代码如下所示:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dyn="http://exslt.org/dynamic"
extension-element-prefixes="dyn"
exclude-result-prefixes="dyn">
使用exslt:node set确实会抑制错误消息org.apache.xpath.objects.XRTreeFrag不能强制转换为org.apache.xpath.objects.XNodeSet
但是,由于某种原因创建的节点集不能用于后续XPath表达式中;至少它似乎不适用于Xalan 2.6.0/XSLT 1.0,因为这样或那样的原因,很多人不得不使用这个版本
有一个简单的解决方案:与其将变量设置为节点集,不如将其设置为XPath表达式。然后,您可以使用dyn:evaluate EXSLT函数来计算变量所持有的XPath表达式
您的代码如下所示:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dyn="http://exslt.org/dynamic"
extension-element-prefixes="dyn"
exclude-result-prefixes="dyn">
字符串$customData或其他字符串应该可以正常工作。不工作。。。用我试过的东西更新了我原来的帖子,有什么问题吗。。。?仍在抛出org.ap
ache.xpath.objects.XRTreeFrag不能强制转换为org.apache.xpath.objects.XNodeSet,但我认为它已经是一个节点集了。。。为什么它在模板中仍被视为RTF?字符串$customData或其他选项应该可以正常工作。不工作。。。用我试过的东西更新了我原来的帖子,有什么问题吗。。。?仍然抛出org.apache.xpath.objects.XRTreeFrag无法转换为org.apache.xpath.objects.XNodeSet,但我认为它已经是一个节点集了。。。为什么它在模板中仍然被视为RTF?你说的“2.0还没有完全支持”是什么意思?由谁支持?浏览器,例如,不是每个人都在使用最新的浏览器。你说“2.0还没有完全支持”是什么意思?谁支持?浏览器,就像不是每个人都在使用最新的浏览器一样。你能发布完整的解决方案吗?我不再在那家公司工作了,它已经有几年历史了。但基本上,您可以根据需要生成或操作xml,并将其存储在变量ex:$customData中,然后在您希望将数据作为参数反馈到另一个函数中时,只需使用exslt:node set$customData传递它。好吧,它并不像您描述的那样工作。错误仅出现在变量定义:。。。。现在是选择…你能发布完整的解决方案吗?我不再在那家公司工作了,它已经有几年的历史了。但基本上,您可以根据需要生成或操作xml,并将其存储在变量ex:$customData中,然后在您希望将数据作为参数反馈到另一个函数中时,只需使用exslt:node set$customData传递它。好吧,它并不像您描述的那样工作。错误仅出现在变量定义:。。。。这就是选择。。。。