XSLT 1.0使用变量遍历节点报Invalid conversion转换错误如何解决?
问题分析与修复方案
错误原因
该错误和XSLT的节点迭代逻辑本身无关,是XSLT 1.0的原生特性限制导致的:
- XSLT 1.0中,未指定
select属性、直接在标签内部构造内容的变量,默认类型为结果树片段(Result Tree Fragment, RTF),XPath路径查询、节点遍历等操作仅支持作用于node-set类型对象,直接将RTF类型变量传入模板做节点遍历就会触发类型转换报错 - 你的变量定义还存在第二个问题:使用了
<xsl:value-of>标签,该标签仅会提取目标节点的纯文本内容,最终变量里存储的是car节点下所有文本拼接的字符串,没有保留节点结构,就算能完成类型转换也找不到color子节点
修复步骤
1. 修正变量定义
将<xsl:value-of>替换为<xsl:copy-of>,完整拷贝car节点的结构到变量中:
<xsl:variable name="entries"> <xsl:if test="$element/Garage/car"> <xsl:copy-of select="$element/Garage/car"/> </xsl:if> </xsl:variable>
2. 引入扩展命名空间
你使用的是Xalan系列XSLT处理器,需要在xsl:stylesheet根标签中声明node-set函数的扩展命名空间:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xalan="http://xml.apache.org/xalan" exclude-result-prefixes="xalan"> <!-- 其他样式表内容 --> </xsl:stylesheet>
如果是其他处理器可替换为对应命名空间:微软MSXML用urn:schemas-microsoft-com:xslt,Saxon 6.x用http://saxon.sf.net/
3. 调用模板时做类型转换
调用自定义模板时,用xalan:node-set()函数将RTF类型的变量转换为可遍历的node-set类型:
<xsl:call-template name="entriesToString"> <xsl:with-param name="table" select="xalan:node-set($entries)"/> </xsl:call-template>
可选:优化遍历模板逻辑
原有模板逻辑会导致最后一个color值重复输出,可调整为如下写法避免冗余:
<xsl:template name="entriesToString"> <xsl:param name="table"/> <xsl:for-each select="$table/color"> <xsl:value-of select="."/> <xsl:choose> <xsl:when test="position() = last()"> <xsl:text>/</xsl:text> </xsl:when> <xsl:otherwise> <xsl:text>,</xsl:text> </xsl:otherwise> </xsl:choose> </xsl:for-each> </xsl:template>
内容的提问来源于stack exchange,提问作者marczin
相关产品推荐
相关产品推荐

