Извлечение информации из ITunes Music Library XML с помощью XSLT? - PullRequest
0 голосов
/ 13 августа 2011

Мне нужно извлечь информацию из файла iTunes Music Library.xml. Поскольку xml находится в форме plist, он стал немного громоздким.

Я хочу получить список всех идентификаторов дорожек из определенного списка воспроизведения, чей «Идентификатор списка воспроизведения» у меня есть.

Например, плейлист iTunes выглядит следующим образом.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Playlists</key>
    <array>
        <dict>
            <key>Name</key><string>Library</string>
            <key>Master</key><true/>
            <key>Playlist ID</key><integer>4053</integer> <!--Ex:4053 I have.-->
            <key>Playlist Items</key>
            <array>
                <dict>
                    <key>Track ID</key><integer>2413</integer>
                </dict>
                <dict>
                    <key>Track ID</key><integer>2083</integer>
                </dict>
                <dict>
                    <key>Track ID</key><integer>2081</integer>
                </dict>
                <dict>
                    <key>Track ID</key><integer>6798</integer>
                </dict>
                         </array>
                   <dict>
                   <!-- Here another playlist will start. with diff playlist ID -->
            <array>

</dict>
</plist>

Подробнее см. В своей библиотеке музыки Itunes.xml.

По сути, мне нужно это. (a) Если указан идентификатор списка воспроизведения (здесь 4053), напечатайте все значения идентификаторов дорожек (здесь: 2413,2083,2081,6798) в этом списке воспроизведения.

Моя попытка:

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="text" /> 

<xsl:template match="/"> 


<xsl:for-each select="plist/dict/array/dict">

    <xsl:choose>
        <xsl:when test="child::integer[preceding-sibling::key[1]='Playlist ID']=4053"> 
           <!-- condition is not working fine, Below lines are working fine -->
        <xsl:for-each select="plist/dict/array/dict/array/dict">
            <xsl:value-of select="child::integer[preceding-sibling::key[1]='Track ID']"/>
            </xsl:for-each>
        </xsl:when>
    </xsl:choose>


</xsl:for-each>

</xsl:template>

</xsl:stylesheet>

Может ли кто-нибудь из экспертов по XSLT помочь мне здесь. Я буду очень рад.

1 Ответ

2 голосов
/ 14 августа 2011

Я совершил глупую ошибку и поймал ее. Путь внутри цикла for-each должен быть относительным. Я выкладываю ответ, может быть, он кому-нибудь поможет позже.

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="text" /> 

<xsl:template match="/"> 


<xsl:for-each select="plist/dict/array/dict">

    <xsl:choose>
        <xsl:when test="child::integer[preceding-sibling::key[1]='Playlist ID']=4053"> 
        <xsl:for-each select="array/dict"> <!--**This should be relative**-->
            <xsl:value-of select="child::integer[preceding-sibling::key[1]='Track ID']"/>
            </xsl:for-each>
        </xsl:when>
    </xsl:choose>

</xsl:for-each>

</xsl:template>

</xsl:stylesheet>

Спасибо.

...