Xml XSL无效类型错误-使用的值设置变量

Xml XSL无效类型错误-使用的值设置变量,xml,xslt,xpath,xslt-1.0,Xml,Xslt,Xpath,Xslt 1.0,我试图获得$deal/总价的价值。在第一个街区,我能够获得价值,一切都很好。在第二个块中,我使用value of设置名为deal的变量,我在尝试显示$deal/total_price时出错。如何使用第二个区块中的设置返回$deal/总价 作品: 问题在于,第二个版本返回的是一个RTFResulting树片段,而不是像第一个版本那样的节点集。XPath查询不能应用于RTF,它只能应用于节点集 对差异的解释 在XSLT-1.0中,您不能像现在这样避免这种情况 我引述甲骨文链接: 结果树片段相当于只包

我试图获得$deal/总价的价值。在第一个街区,我能够获得价值,一切都很好。在第二个块中,我使用value of设置名为deal的变量,我在尝试显示$deal/total_price时出错。如何使用第二个区块中的设置返回$deal/总价

作品:


问题在于,第二个版本返回的是一个RTFResulting树片段,而不是像第一个版本那样的节点集。XPath查询不能应用于RTF,它只能应用于节点集

对差异的解释

在XSLT-1.0中,您不能像现在这样避免这种情况

我引述甲骨文链接:

结果树片段相当于只包含根节点的节点集。 不能对结果树片段应用//、//或谓词之类的运算符。它们仅适用于节点集数据类型

最简单的解决方案可能是使用XSLT-2.0,因为在XSLT-2.0中,所有变量都是节点集,RTF已被消除。

变量类型是通过计算select XPath表达式来定义的,该表达式在XSLT/XPath 1.0中返回一个节点集。然后可以对节点集执行XPath导航,例如选择子节点

某些XSLT 1.0处理器(尤其是IE或.NET framework中的Edge和XslTransform使用的各种MSXML版本)不支持exsl:node set,而是在专有名称空间中支持类似的函数,即

在xsl:variable内部,您当然可以使用xsl:choose,例如


正如其他人所说,只有在xsl:variable标记中使用内联选择属性才能生成可用的节点集

但是,您不必使用更高版本的XSLT或特定的XSLT扩展,这在共享主机上可能是不可能的

为了满足备用节点集的需要,诀窍是使用| union操作符连接每个备用节点集,但确保[]中不需要的备用节点的条件不会返回任何节点

测试不必依赖于[]所附加到的元素,但可以使用所需的任何变量和文字来确保替代方案只生成具有其自身唯一标准的节点集,而不会生成其他节点集

要在上面的评论中用您的示例的变体进行说明:

<xsl:value-of select="/webpage/results/cars/*[($access_type = 'web') and (partner_name = $company_name) and (vehicle_class_description = $vehicle_class_description_full) and (pay_now = 'Y')]|/webpage/results/cars/*[($access_type = 'phone') and (partner_name = $company_name) and (vehicle_class_description = $vehicle_class_description_full)]"/>
其中,$web_access是一个变量,它不是被测试XML数据的直接部分


如果有太多的选择,它可能会变得笨拙,但可以通过测试每个备选方案来减轻这一问题,以确保它仅在需要时生成一个节点集,否则为空。然后只需在select中将它们连接在一起,中间加一个|。

有没有办法使用if/else语句更改变量的值?示例将variable设置为true或将variable设置为false也许您应该在这里解释真正的问题-即,您想要在这里完成的事情无法使用xsl:copy-of直接选择来完成。我的最终目标是根据不同的标志更改variable deal的值。示例:如果pay_now==true else使用XSL 1.0,那么在不抛出未声明的错误变量的情况下,使用条件来更改变量值的最佳方法是什么?我担心您在解释如何做某事而不是想做什么时犯了错误。变量本身从来不是目标,只是一种手段。-另外,请不要在评论中发布代码,它实际上是不可读的。
<xsl:variable name="deal">
    <xsl:value-of select="/webpage/results/cars/*[partner_name = $company_name and vehicle_class_description = $vehicle_class_description_full]"/>
</xsl:variable>
<xsl:value-of select="$deal/total_price"/>
Warning: XSLTProcessor::transformToXml(): Invalid type
Warning: XSLTProcessor::transformToXml(): runtime error:
Warning: XSLTProcessor::transformToXml(): XPath evaluation returned no result
<xsl:variable name="deal">
    <xsl:value-of select="/webpage/results/cars/*[partner_name = $company_name and vehicle_class_description = $vehicle_class_description_full]"/>
</xsl:variable>
<xsl:variable name="deal-rtf">
  <foo>
    <bar>...</bar>
  </foo>
</xsl:variable>
<xsl:variable name="deal" select="exsl:node-set($deal-rtf)" xmlns:exsl="http://exslt.org/common"/>

<xsl:value-of select="$deal/foo/bar"/>
<xsl:variable name="deal-rtf">
  <xsl:choose>
     <xsl:when test="...">
       <xsl:copy-of select="/webpage/results/cars/*[partner_name = $company_name and vehicle_class_description = $vehicle_class_description_full and pay_now = 'Y']"/>
     </xsl:when>
     <xsl:otherwise>
        <xsl:copy-of select="webpage/results/cars/*[partner_name = $company_name and vehicle_class_description = $vehicle_class_description_full]"/>
     </xsl:otherwise>
  </xsl:choose>
</xsl:variable>

<xsl:variable name="deal" select="exsl:node-set($deal-rtf)" xmlns:exsl="http://exslt.org/common"/>

<xsl:value-of select="$deal/total_price"/>
<xsl:value-of select="/webpage/results/cars/*[($access_type = 'web') and (partner_name = $company_name) and (vehicle_class_description = $vehicle_class_description_full) and (pay_now = 'Y')]|/webpage/results/cars/*[($access_type = 'phone') and (partner_name = $company_name) and (vehicle_class_description = $vehicle_class_description_full)]"/>