2011-08-12 42 views
0

我需要从iTunes Music Library.xml文件中提取信息。由于xml是plist的形式,所以它变得有点麻烦。使用XSLT从iTunes音乐库XML中提取信息?

我想从一个特定播放列表中获取所有音轨ID的列表,这个列表的播放列表ID是我的。

例如,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 Music Library.xml。

基本上,我需要的是这个。 (a)给定播放列表ID(此处为4053),打印该播放列表下的所有曲目ID值(此处为: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

请输入一个有效的XML,它现在不是一个有效的XML(结束标记丢失)。如果您显示样本所需的输出,这将会很有帮助。 – therealmarv

+0

嗨“therealmarv”,我修改了我的问题。基本上我解析iTunes音乐library.xml文件。如果你安装了iTunes,你可以检查库xml以更好地理解xml格式。但我已经在上面解释过了。谢谢。 –

+0

Mac OS X :(用于iTunes库文件的路径) **/Users/username/Music/iTunes/iTunes Library.xml ** Windows XP ** \ Documents and Settings \ username \ My Documents \ My Music \ iTunes \ iTunes Library.xml ** Windows Vista ** \ Users \ username \ Music \ iTunes \ iTunes Library.xml ** Windows 7 ** \ Users \ username \ My Music \ iTunes \ iTunes Library.xml ** –

回答

2

我犯了一个愚蠢的错误,并抓住它。 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> 

谢谢。