QXmlQuery调用setQuery(QString)实现XML转HTML失败问题咨询
1. 缺少基准URI导致相对资源引用失败
如果你的XSL文件中存在<xsl:import>、<xsl:include>标签,或是其他引用外部资源的相对路径,调用setQuery(QUrl("file.xsl"))时,Qt会自动将该URL对应的文件目录作为基准URI,解析所有相对路径引用。
直接传入XSL内容的QString时,如果没有主动指定基准URI,QXmlQuery无法定位相对路径指向的资源,会直接触发XSLT解析失败,导致后续执行报错。
可以调用setQuery的双参数重载修复该问题:
// 第二个参数传入原XSL文件的本地路径作为基准URI query.setQuery(xslContent, QUrl::fromLocalFile("/path/to/your/file.xsl"));
2. XSL文件读取编码不匹配
读取XSL文件内容到QString时使用的编码和文件实际编码不符,会导致QString中存储的内容为乱码,XSLT解析器无法识别合法语法结构直接报错。setFocus传入XML字符串正常,大概率是XML内容的编码声明和你读取时使用的编码刚好匹配,或是XML内容没有特殊字符未触发编码问题。
建议排查文件读取逻辑,确保读取编码和XSL头部声明的encoding属性一致,例如UTF-8编码的文件需要用QString::fromUtf8()转换读取到的字节流,不要使用默认的QString构造方法。
3. 未显式指定XSLT处理模式(低版本Qt易触发)
部分旧版本Qt中,传入后缀为.xsl的QUrl时,Qt会自动识别为XSLT处理模式,但直接传入字符串时会默认当成普通XQuery脚本处理,无法解析XSLT的语法结构。
可以在调用setQuery前显式设置查询语言:
query.setQueryLanguage(QXmlQuery::XSLT20);
4. XSL文件读取不完整
如果读取XSL文件时没有判断文件是否成功打开、是否读取完全,可能导致QString中存储的是不完整的XSL代码,语法校验不通过直接报错。可以先打印输出读取到的XSL字符串,确认内容和原文件完全一致。
内容的提问来源于stack exchange,提问作者dmitryg

