2

我需要从 iTunes library.xml 文件中提取 Track ID 和 Location。我找到了一些 XSLT 解决方案,但它们都是基于 XSLT 2.0 版的。

我仅限于 XSLT 1.0 版。

任何人都可以帮助如何做到这一点。

输出应该是:

98,location---
100,location 2

非常感谢马蒂亚斯的帮助

<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
   <dict>
      <key>Tracks</key>
      <dict>
         <key>98</key>
         <dict>
            <key>Track ID</key>
            <integer>98</integer>
            <key>Name</key>
            <string>xxxxxx</string>
            <key>Location</key>
            <string>location---</string>
         </dict>
         <key>100</key>
         <dict>
            <key>Track ID</key>
            <integer>100</integer>
            <key>Name</key>
            <string>name2</string>
            <key>Location</key>
            <string>location 2</string>
         </dict>
      </dict>
   </dict>
</plist>
4

3 回答 3

2

因此,对于要提取的keyTracks 中的每个. 这个怎么样:dictLocation

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="text" />

  <xsl:template match="/">
    <xsl:apply-templates select="plist/dict/dict/key" />
  </xsl:template>

  <xsl:template match="key">
    <xsl:value-of select="." />
    <xsl:text>,</xsl:text>
    <!-- find the dict corresponding to this key, and extract the value of
         the Location entry -->
    <xsl:value-of select="
       following-sibling::dict[1]/key[. = 'Location']/following-sibling::string[1]" />
    <xsl:text>&#10;</xsl:text>
  </xsl:template>
</xsl:stylesheet>

如果 plist 始终将 Location 作为最后一个条目,那么您可以简单地说

    <xsl:value-of select="following-sibling::dict[1]/string[last()]" />

但是通过找到正确的键值然后获取它的第一个追随者来做到这string一点更加健壮。

于 2013-11-04T12:51:21.257 回答
0

假设输入正确(再关闭</dict>),您可以使用以下样式表。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:output method="text" />
   <xsl:template match="/">
      <xsl:apply-templates />
   </xsl:template>
   <xsl:template match="plist">
      <xsl:apply-templates />
   </xsl:template>
   <xsl:template match="dict[parent::plist]">
      <xsl:apply-templates />
   </xsl:template>
   <xsl:template match="key[.='Tracks']/dict">
      <xsl:for-each select="descendant::dict">
         <xsl:value-of select="preceding-sibling::key" />
         <xsl:text>,</xsl:text>
         <xsl:value-of select="descendant::key[.='Location']/following-sibling::string" />
         <xsl:text />
      </xsl:for-each>
   </xsl:template>
   <xsl:template match="key|string[preceding-sibling::key[1]='Name']" />
</xsl:stylesheet>

编辑@Ian 是的,你当然是对的。我改变了我的说法。

请注意,following-sibling由于 XML 文件的层次结构较浅,您必须依赖于导航文档树。

于 2013-11-04T13:05:55.243 回答
0

将文件头中的 XSLT 版本号更改为 1.0。我无法想象这么简单的输出需要 1.0 不支持的任何东西。

于 2013-11-04T12:43:41.307 回答