错误XTSE0620:解析xslt时解析错误string usint QT-XSLT

问题描述:

我正在使用xslt语法解析itunes库XML文件。错误XTSE0620:解析xslt时解析错误string usint QT-XSLT

这里的示例代码

void ITunesMlibParser::createXslForPlistItems(QString &out, int playlistID) 
    { 

      std::stringstream ss; 
     ss << "<?xml version=\"1.0\" encoding=\"utf-8\"?>"; 
     ss << "<xsl:stylesheet version=\"2.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" xmlns:fn=\"fn\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">"; 
     ss << "<xsl:output method=\"text\" />"; 

     ss << "<xsl:template match=\"/\">"; 
     // ss << "<xsl:variable name=\"myplaylist\" select=\"'6711'\"/>"; 


     ss << "<xsl:variable name=\"myplaylist\" select=\"'"<< playlistID <<"'\">" ; 

     ss << "<xsl:variable name=\"playlist_tracks\" select=\"/plist/dict/array/dict[integer[preceding-sibling::key[1]='Playlist ID']=$myplaylist]/array/dict/integer[preceding-sibling::key[1]='Track ID']\" />"; 
     ss << "<xsl:variable name=\"tracks\" select=\"/plist/dict/dict/dict[integer[preceding-sibling::key[1]='Track ID']=$playlist_tracks]\" />"; 

     ss << "<xsl:for-each select=\"$tracks\">"; 
     ss << "<xsl:value-of select=\"integer[preceding-sibling::key[1]='Track ID']\"/>"; 
     ss << "<xsl:text>,</xsl:text>"; 
     ss << "<xsl:value-of select=\"string[preceding-sibling::key[1]='Name']\"/>"; 
     ss << "<xsl:text>,</xsl:text>"; 
     ss << "<xsl:value-of select=\"integer[preceding-sibling::key[1]='Total Time']\"/>"; 
     ss << "<xsl:text>,</xsl:text>"; 
     ss << "<xsl:value-of select=\"string[preceding-sibling::key[1]='Kind']\"/>"; 
     ss << "<xsl:text>,</xsl:text>"; 
     ss << "<xsl:value-of select=\"string[preceding-sibling::key[1]='Location']\"/>"; 
     ss << "<xsl:text>&#xa;</xsl:text>"; 
     ss << "</xsl:for-each>"; 
     ss << "</xsl:template>"; 
     ss << "</xsl:stylesheet>"; 
     ss << ""; 

     out = QString::fromStdString(ss.str());   
     return; 

} 

考虑下面两行:

// ss << "<xsl:variable name=\"myplaylist\" select=\"'6711'\"/>"; 
    ss << "<xsl:variable name=\"myplaylist\" select=\"'"<< playlistID <<"'\">" ; 

如果播放列表= 6711的我硬编码的整数值,解析器作品。但如果我编程传递一个整数值,它会给出下面的错误。

Error XTSE0620 line 11, column 190: When attribute select is present on variable, a sequence constructor cannot be used. 

// My comment --> line 11 is below or I am not sure if this is guilty line as it works with hard coded value. 

<xsl:variable name="playlist_tracks" select="/plist/dict/array/dict[integer[preceding-sibling::key[1]='Playlist ID']=$myplaylist]/array/dict/integer[preceding-sibling::key[1]='Track ID']" /> 

我被困在这里,急需XSLT专家的一些输入。

+0

问得好,+1。查看我的答案,了解错误及其简单解决方案。 –

我想你只需要确保任何具有select属性的xsl:variable元素都没有内容,所以请确保你有例如<xsl:variable name="var-name" select="2"/><xsl:variable name="var-name" select="2"></xsl:variable>。 所以用你的C++你可能想要尽管我没有真正的读写C++的训练。

我也想知道为什么你的XSLT/XPath的您正试图引用整数值作为这样你得到的XPath字符串,而XPath的也有数字。因此,根据您的需求,您可能需要删除单引号:ss << "<xsl:variable name=\"myplaylist\" select=\""<< playlistID <<"\"/>" ;

+0

感谢它的工作。你马上就解决了这个问题。你节省了我的时间。 –

Consider below two lines: 

    // ss << "<xsl:variable name=\"myplaylist\" select=\"'6711'\"/>";  
    ss << "<xsl:variable name=\"myplaylist\" select=\"'"<< playlistID <<"'\">" ; 

的错误是相当明显的:在第二种情况下,你不要关闭产生<xsl:variable>元素。

必须(注意/在最后):

ss << "<xsl:variable name=\"myplaylist\" select=\"'"<< playlistID <<"'\"/>" ; 
+0

非常感谢。我知道了。我的坏,这是愚蠢的错误,我正在寻找其他地方。 –

+0

@Rakesh Singh:不客气。 –