2014-01-04 7 views
0

Я следую this article, чтобы получить содержимое плейлисты автор говорит следующее XSL может использоваться для преобразования имени плейлисты в формате M3U:Как подать аргумент XSL Transformation?

<?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, я подумал, что мне, возможно, придется заменить $ плейлист с именем плейлиста. Я прав? И если да, то как я могу сделать это эффективно, как дополнение к следующему коду:

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

Это не [появляется] (HTTP: // WWW. xml.com/lpt/a/1495) вам нужны аргументы. Чего вы хотите сделать? – hd1

+0

Автор говорит, что вы получаете ** названный список воспроизведения ** как M3U, поэтому я не знаю, как Transformer использовать плейлист – s3lph

ответ

0

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

transformer.setParameter("playlist", playlist); 

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

Если вы собираетесь вызывать этот метод несколько раз, то вместо загрузки и компиляции STYLESHEET каждый раз, когда он будет более эффективным, чтобы загрузить его один раз, а затем повторно использовать один и тот же 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

Нет, я вызываю это один раз после запуска программы и работаю с M3U. Огромное спасибо. – s3lph

Смежные вопросы