2011-08-12 43 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> 

謝謝。