2014-01-03 2 views
0

Я пытаюсь получить плейлисты, сохраненные в библиотеке iTunes, используя XSLT. Я следую this article и я использую первый XML на второй странице, как схемы для преобразования:XSL-преобразование не удалось скомпилировать таблицу стилей

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

    <xsl:output method="text" /> 

    <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"> 
     <xsl:value-of select="key[text()='Name']/ \ 
following-sibling::string" /><xsl:value-of select="$newline" /> 
    </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 

Мой Java код выглядит следующим образом:

private File library = new File("iTunes Music Library.xml"); 

public String getPlaylists() { 
     Source source = new StreamSource(library); 
     StreamSource xsl = new StreamSource(getClass().getResourceAsStream("iTunesPL.xml")); //the XSL above 
     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; 
     } 
    } 

Но это не работает. Ошибка отображается следующая: (в переводе на английский язык со мной, так что может не выглядеть точно так же в вашей системе ...)

[Fatal Error] :2:6: Procession-command-target corresponding to "[xX][mM][lL]" is not allowed. 
ERROR: 'Stylesheet couldn't be compiled.' 
FATAL ERROR: "Stylesheet konnte nicht kompiliert werden" 
      :Procession-command-target corresponding to "[xX][mM][lL]" is not allowed. 
javax.xml.transform.TransformerConfigurationException: Stylesheet couldn't be compiled 
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:891) 
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTransformer(TransformerFactoryImpl.java:671) 
    at me.the_seppi.jaisb.ITunesPlaylistFetcher.convert(ITunesPlaylistFetcher.java:27) 
    at me.the_seppi.jaisb.Main.getITunesPlaylists(Main.java:193) 
    at me.the_seppi.jaisb.Main.main(Main.java:40) 
Caused by: org.xml.sax.SAXParseException; lineNumber: 2; columnNumber: 6; Procession-command-target corresponding to "[xX][mM][lL]" is not allowed. 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1236) 
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:568) 
    at com.sun.org.apache.xalan.internal.xsltc.compiler.Parser.parse(Parser.java:427) 
    at com.sun.org.apache.xalan.internal.xsltc.compiler.Parser.parse(Parser.java:479) 
    at com.sun.org.apache.xalan.internal.xsltc.compiler.XSLTC.compile(XSLTC.java:354) 
    at com.sun.org.apache.xalan.internal.xsltc.compiler.XSLTC.compile(XSLTC.java:456) 
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:852) 
    ... 6 more 
--------- 
org.xml.sax.SAXParseException; lineNumber: 2; columnNumber: 6; Procession-command-target corresponding to "[xX][mM][lL]" is not allowed. 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1236) 
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:568) 
    at com.sun.org.apache.xalan.internal.xsltc.compiler.Parser.parse(Parser.java:427) 
    at com.sun.org.apache.xalan.internal.xsltc.compiler.Parser.parse(Parser.java:479) 
    at com.sun.org.apache.xalan.internal.xsltc.compiler.XSLTC.compile(XSLTC.java:354) 
    at com.sun.org.apache.xalan.internal.xsltc.compiler.XSLTC.compile(XSLTC.java:456) 
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:852) 
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTransformer(TransformerFactoryImpl.java:671) 
    at me.the_seppi.jaisb.ITunesPlaylistFetcher.convert(ITunesPlaylistFetcher.java:27) 
    at me.the_seppi.jaisb.Main.getITunesPlaylists(Main.java:193) 
    at me.the_seppi.jaisb.Main.main(Main.java:40) 

Что я делаю неправильно? Библиотека была создана iTunes 10.5.3.

ответ

1

Обратные косые черты не должны быть там. Попробуйте:

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

<xsl:output method="text" /> 

<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"> 
     <xsl:value-of select="key[text()='Name']/following-sibling::string" /> 
     <xsl:value-of select="$newline" /> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 
+0

Или просто избавиться от обратной косой черты. Новая линия между атрибутами не наносит вреда. (Я полагаю, вы считали, что вам нужно избегать этого. – keshlam

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