Я слежу за этой статьей, чтобы получить содержимое плейлиста iTunes Автор говорит, что следующий XSL можно использовать для преобразования именованного плейлиста iTunes в формат M3U:

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

  <xsl:output method="text" />

  <xsl:param name="playlist" />

  <xsl:variable name="newline">
<xsl:text>
</xsl:text>
  </xsl:variable>

  <xsl:template match="/">
    <xsl:for-each select="plist/dict/key[text()='Playlists']/
following-sibling::array/dict/key[text()='Name']/
following-sibling::string[text()=$playlist]/
following-sibling::key[text()='Playlist Items']/
following-sibling::array/dict">
      <xsl:call-template name="track">
        <xsl:with-param name="trackid" select=
"key[text()='Track ID']/following-sibling::integer" />
      </xsl:call-template>
    </xsl:for-each>
  </xsl:template>

  <xsl:template name="track">
    <xsl:param name="trackid" />
      <xsl:variable name="url" 
select="//plist/dict/key[text()='Tracks']/
following-sibling::dict/dict/key[text()='Track ID']/
following-sibling::integer[text()=$trackid]/../
key[text()='Location']/following-sibling::string" />
<xsl:value-of select="$url" /><xsl:value-of select="$newline" />
    </xsl:template>

</xsl:stylesheet>

Как я могу это сделать? Из того, что я до сих пор узнал о XSL, я подумал, что мне, возможно, придется заменить $ playlist на имя списка воспроизведения. Я прав? И если да, то как я могу сделать это эффективно в качестве дополнения к следующему коду:

public String getPlaylist(String playlist) {
    Source source = new StreamSource(library);
    StreamSource xsl = new StreamSource(getClass().getResourceAsStream("M3Utransformation.xml"));
    StringWriter w = new StringWriter();
    Result result = new StreamResult(w);
    try {
        Transformer transformer = TransformerFactory.newInstance().newTransformer(xsl);
        transformer.transform(source, result);
        return w.getBuffer().toString();
    } catch (Throwable t) {
        t.printStackTrace();
        return null;
    }
}
0
s3lph 4 Янв 2014 в 16:18
Это не появляется, вам нужны аргументы. Что вы собираетесь делать?
 – 
hd1
4 Янв 2014 в 16:24
Автор говорит, что он дает вам именованный плейлист как M3U, поэтому я не знаю, как преобразовать, какой плейлист использовать
 – 
s3lph
4 Янв 2014 в 16:26

1 ответ

Лучший ответ

Transformer имеет API для передачи значений параметров, вам просто нужно добавить

transformer.setParameter("playlist", playlist);

Непосредственно перед линией transformer.transform(...).

Если вы собираетесь вызывать этот метод несколько раз, вместо того, чтобы каждый раз загружать и компилировать таблицу стилей, было бы более эффективно загрузить ее один раз, а затем повторно использовать тот же Transformer для будущих вызовов:

private Transformer transformer = null;

public String getPlaylist(String playlist) {
    if(transformer == null) {
        StreamSource xsl = new StreamSource(getClass().getResourceAsStream("M3Utransformation.xml"));
        try {
            transformer = TransformerFactory.newInstance().newTransformer(xsl);
        } catch (Throwable t) {
            t.printStackTrace();
            return null;
        }
    }
    StringWriter w = new StringWriter();
    Source source = new StreamSource(library);
    Result result = new StreamResult(w);
    try {
        transformer.setParameter("playlist", playlist);
        transformer.transform(source, result);
        return w.getBuffer().toString();
    } catch (Throwable t) {
        t.printStackTrace();
        return null;
    }
}

(Обратите внимание, что Transformer не является потокобезопасным, поэтому, если вы выполняете вызовы из нескольких потоков, вам придется вместо этого использовать механизм Templates)

0
Ian Roberts 4 Янв 2014 в 16:37
Нет, я вызываю это один раз после запуска программы и работаю с файлом M3U. Большое спасибо.
 – 
s3lph
4 Янв 2014 в 16:42