Я анализирую XML-файл библиотеки itunes, используя грамматику 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>
</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 <<"'\">" ;
Если я жесткий кодЦелочисленное значение Playlist = 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.