Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt 无法从XRTreeFrag强制转换到XNodeSet_Xslt_Param_Node Set - Fatal编程技术网

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传递它。好吧,它并不像您描述的那样工作。错误仅出现在变量定义:。。。。这就是选择。。。。