Ошибка XTSE0620: ошибка разбора при разборе строки xslt usint QT-XSLT - PullRequest
2 голосов
/ 20 августа 2011

Я анализирую 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>&#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 <<"'\">" ;

Если я жесткий кодЦелочисленное значение 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.

Ответы [ 2 ]

1 голос
/ 20 августа 2011
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 <<"'\"/>" ;
1 голос
/ 20 августа 2011

Я думаю, вам просто нужно убедиться, что у любого элемента xsl:variable, который имеет атрибут select, нет содержимого, поэтому убедитесь, что у вас есть, например, <xsl:variable name="var-name" select="2"/> или <xsl:variable name="var-name" select="2"></xsl:variable>. Так что с вашим C ++ вы, вероятно, хотите, например, ss << "<xsl:variable name=\"myplaylist\" select=\"'"<< playlistID <<"'\"/>" ; хотя я не очень обучен читать и писать на C ++.

Мне также интересно, почему с вашим XSLT / XPath вы пытаетесь заключить в кавычки целочисленные значения, как вы получаете строки в XPath, в то время как в XPath также есть числа. Поэтому, в зависимости от ваших потребностей, вы можете отказаться от одинарных кавычек: ss << "<xsl:variable name=\"myplaylist\" select=\""<< playlistID <<"\"/>" ;.

...