Вы можете просто создать переменную и заполнить ее результаты выражением XPath за один раз, а не целочисленно его построить.
<xsl:variable name="tracks"
select="plist/dict/array/dict[integer[preceding-sibling::key[1]='Playlist ID']=6711]/array/dict/integer[preceding-sibling::key[1]='Track ID']" />
В качестве альтернативы вы можете использовать xsl: keys в начале вашего документа, я предполагаю, что путь к информации о дорожке равен /plist/dict/array/dict
с первым ключом dict, равным Tracks
<xsl:key
name="playlists"
match="plist/dict/array/dict/array/dict/integer[preceding-sibling::key[1]='Track ID']"
use="../../../integer[preceding-sibling::key[1]='Playlist ID']"
/>
<xsl:key
name="tracks"
match="/plist/dict/array[preceding-sibling::key[1]='Tracks']/dict"
use="integer[preceding-sibling::key[1]='Track ID']"
/>
Это позволяет вам сделать key('playlists','4555')
, чтобы вернуть все трекиды, связанные с идентификатором списка воспроизведения 4555
, а также key('tracks','1234')
, чтобы получить объект dict, связанный с идентификатором дорожки 1234
Затем вы можете объединить их вместе, чтобы сделать
<xsl:variable "mytracks" select="key('tracks',key('playlists','6711'))" />
Это установит $mytracks
равным массиву объектов dict для дорожек в списке воспроизведения 6711. Также есть преимущества повышения скорости, предоставляемые xsl: key
РЕДАКТИРОВАТЬ ОБНОВЛЕНИЕ ----
Я предполагаю, что вы пытаетесь сделать CSV из этого, поэтому этот код должен сделать это
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="text" />
<xsl:key
name="playlists"
match="plist/dict/array/dict/array/dict/integer[preceding-sibling::key[1]='Track ID']"
use="../../../integer[preceding-sibling::key[1]='Playlist ID']"
/>
<xsl:key
name="tracks"
match="/plist/dict/dict/dict"
use="integer[preceding-sibling::key[1]='Track ID']"
/>
<xsl:template match="/">
<xsl:variable name="myplaylist" select="'6711'"/>
<xsl:for-each select="key('tracks',key('playlists',$myplaylist))">
<xsl:value-of select="integer[preceding-sibling::key[1]='Track ID']"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="string[preceding-sibling::key[1]='Name']"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="integer[preceding-sibling::key[1]='Total Time']"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="string[preceding-sibling::key[1]='Location']"/>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
, чтобы соответствовать другому идентификатору плейлиста, просто измените значение myplaylist
- РЕДАКТИРОВАТЬ версию без xsl:key
, просто измените значение переменной myplaylist
- РЕДАКТИРОВАТЬ Теперь mofified к оригинальному порядку сортировки списка воспроизведения
--EDIT Попытка обойти ограничения Qt
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="text" />
<xsl:template match="/">
<xsl:variable name="myplaylist" select="'4053'"/>
<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']" />
<xsl:for-each select="$playlist_tracks">
<xsl:variable select="." name="current" />
<xsl:for-each select ="/plist/dict/dict/dict[integer[preceding-sibling::key[1]='Track ID']=$current]" >
<xsl:value-of select="integer[preceding-sibling::key[1]='Track ID']"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="string[preceding-sibling::key[1]='Name']"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="integer[preceding-sibling::key[1]='Total Time']"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="string[preceding-sibling::key[1]='Location']"/>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>