java - XSL 转换无法编译样式表

标签 java xml xslt

我正在尝试使用 XSLT 获取保存在 iTunes 库中的播放列表。我正在关注 this article 并使用第二页上的第一个 XML 作为转换方案​​:

<?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 创建的。

最佳答案

反斜杠不应该出现在那里。尝试:

<?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 - XSL 转换无法编译样式表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20912508/

相关文章:

xslt - 通过 XSLT 用 XHTML 中的标签替换 style= 属性

java - 在 TextArea 中动态更改字体大小及其样式会导致填充错误

java - 动态添加布局,以与其他布局重叠

xml - 如何在 DIV 中显示 XML 数据

android - 虚拟机重载? LinearLayout背景图片

java - 以新格式格式化我返回的 xml 响应字符串

c# - 使用XSLT的“路径中的非法字符”

java - Android:如果有任何声音发生,听众记录声音

java - 为什么 GridBagLayout 将我的组件居中而不是放在角落?

c# - 通过 LINQ 创建 XML 文档,添加 xmlns,xmlns :xsi to it