Apache Ant XSLT Task wirft eine Exception
kati
- programmiertechnik
2 Christian Seiler2 Christian Seiler0 kati0 Christian Seiler0 kati
Ich habe ein Problem mit dem Apache Ant Task XSLT. Es wird eine Exception geworfen (siehe unten). Nach meinem Wissensstand grundlos.
Konfiguration von ANT:
* ant -version:
<pre>
Apache Ant version 1.7.0 compiled on August 29 2007
</pre>
Der Ant-Task schaut so aus:
<pre>
<xslt in="dummy.xml" out="dummy.html" style="dummy.xsl"/>
</pre>
* dummy.xml ist dabei ein gültiges XML-Dokument
* dummy.xsl sieht so aus:
<pre>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
</xsl:stylesheet>
</pre>
Die geworfene Exception:
<pre>
my_xslt_target:
[xslt] Using class org.apache.tools.ant.taskdefs.optional.TraXLiaison
[xslt] In file /data/dummy.xml time: 1231784939000
[xslt] Out file /data/dummy.html time: 0
[xslt] Style file dummy.xsl time: 1231785525000
[xslt] Processing /data/dummy.xml to /data/dummy.html
[xslt] Loading stylesheet /data/dummy.xsl
[xslt] Failed to process /data/dummy.xml
BUILD FAILED
/data/checkstyle-5.0-beta01/build.xml:25: javax.xml.transform.TransformerConfigurationException: no xsl:version attribute on literal result node
at org.apache.tools.ant.taskdefs.XSLTProcess.process(XSLTProcess.java:720)
at org.apache.tools.ant.taskdefs.XSLTProcess.execute(XSLTProcess.java:333)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288)
at java.lang.reflect.Method.invoke(libgcj.so.81)
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:105)
at org.apache.tools.ant.Task.perform(Task.java:348)
at org.apache.tools.ant.Target.execute(Target.java:357)
at org.apache.tools.ant.Target.performTasks(Target.java:385)
at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1329)
at org.apache.tools.ant.Project.executeTarget(Project.java:1298)
at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
at org.apache.tools.ant.Project.executeTargets(Project.java:1181)
at org.apache.tools.ant.Main.runBuild(Main.java:698)
at org.apache.tools.ant.Main.startAnt(Main.java:199)
at org.apache.tools.ant.launch.Launcher.run(Launcher.java:257)
at org.apache.tools.ant.launch.Launcher.main(Launcher.java:104)
Caused by: javax.xml.transform.TransformerConfigurationException: no xsl:version attribute on literal result node
at gnu.xml.transform.Stylesheet.doParse(libgcj.so.81)
at gnu.xml.transform.Stylesheet.parse(libgcj.so.81)
at gnu.xml.transform.Stylesheet.<init>(libgcj.so.81)
at gnu.xml.transform.TransformerFactoryImpl.newStylesheet(libgcj.so.81)
at gnu.xml.transform.TransformerFactoryImpl.newTemplates(libgcj.so.81)
at org.apache.tools.ant.taskdefs.optional.TraXLiaison.readTemplates(TraXLiaison.java:303)
at org.apache.tools.ant.taskdefs.optional.TraXLiaison.createTransformer(TraXLiaison.java:320)
at org.apache.tools.ant.taskdefs.optional.TraXLiaison.transform(TraXLiaison.java:170)
at org.apache.tools.ant.taskdefs.XSLTProcess.process(XSLTProcess.java:709)
...15 more
Caused by: javax.xml.transform.TransformerConfigurationException: no xsl:version attribute on literal result node
at gnu.xml.transform.Stylesheet.doParse(libgcj.so.81)
...23 more
--- Nested Exception ---
javax.xml.transform.TransformerConfigurationException: no xsl:version attribute on literal result node
at gnu.xml.transform.Stylesheet.doParse(libgcj.so.81)
at gnu.xml.transform.Stylesheet.parse(libgcj.so.81)
at gnu.xml.transform.Stylesheet.<init>(libgcj.so.81)
at gnu.xml.transform.TransformerFactoryImpl.newStylesheet(libgcj.so.81)
at gnu.xml.transform.TransformerFactoryImpl.newTemplates(libgcj.so.81)
at org.apache.tools.ant.taskdefs.optional.TraXLiaison.readTemplates(TraXLiaison.java:303)
at org.apache.tools.ant.taskdefs.optional.TraXLiaison.createTransformer(TraXLiaison.java:320)
at org.apache.tools.ant.taskdefs.optional.TraXLiaison.transform(TraXLiaison.java:170)
at org.apache.tools.ant.taskdefs.XSLTProcess.process(XSLTProcess.java:709)
at org.apache.tools.ant.taskdefs.XSLTProcess.execute(XSLTProcess.java:333)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288)
at java.lang.reflect.Method.invoke(libgcj.so.81)
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:105)
at org.apache.tools.ant.Task.perform(Task.java:348)
at org.apache.tools.ant.Target.execute(Target.java:357)
at org.apache.tools.ant.Target.performTasks(Target.java:385)
at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1329)
at org.apache.tools.ant.Project.executeTarget(Project.java:1298)
at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
at org.apache.tools.ant.Project.executeTargets(Project.java:1181)
at org.apache.tools.ant.Main.runBuild(Main.java:698)
at org.apache.tools.ant.Main.startAnt(Main.java:199)
at org.apache.tools.ant.launch.Launcher.run(Launcher.java:257)
at org.apache.tools.ant.launch.Launcher.main(Launcher.java:104)
Caused by: javax.xml.transform.TransformerConfigurationException: no xsl:version attribute on literal result node
at gnu.xml.transform.Stylesheet.doParse(libgcj.so.81)
...23 more
caused by javax.xml.transform.TransformerConfigurationException: no xsl:version attribute on literal result node
at gnu.xml.transform.Stylesheet.doParse(libgcj.so.81)
at gnu.xml.transform.Stylesheet.parse(libgcj.so.81)
at gnu.xml.transform.Stylesheet.<init>(libgcj.so.81)
at gnu.xml.transform.TransformerFactoryImpl.newStylesheet(libgcj.so.81)
at gnu.xml.transform.TransformerFactoryImpl.newTemplates(libgcj.so.81)
at org.apache.tools.ant.taskdefs.optional.TraXLiaison.readTemplates(TraXLiaison.java:303)
at org.apache.tools.ant.taskdefs.optional.TraXLiaison.createTransformer(TraXLiaison.java:320)
at org.apache.tools.ant.taskdefs.optional.TraXLiaison.transform(TraXLiaison.java:170)
at org.apache.tools.ant.taskdefs.XSLTProcess.process(XSLTProcess.java:709)
at org.apache.tools.ant.taskdefs.XSLTProcess.execute(XSLTProcess.java:333)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288)
at java.lang.reflect.Method.invoke(libgcj.so.81)
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:105)
at org.apache.tools.ant.Task.perform(Task.java:348)
at org.apache.tools.ant.Target.execute(Target.java:357)
at org.apache.tools.ant.Target.performTasks(Target.java:385)
at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1329)
at org.apache.tools.ant.Project.executeTarget(Project.java:1298)
at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
at org.apache.tools.ant.Project.executeTargets(Project.java:1181)
at org.apache.tools.ant.Main.runBuild(Main.java:698)
at org.apache.tools.ant.Main.startAnt(Main.java:199)
at org.apache.tools.ant.launch.Launcher.run(Launcher.java:257)
at org.apache.tools.ant.launch.Launcher.main(Launcher.java:104)
</pre>
Wieso wird diese Exception geworfen, wo doch das version-Attribut definiert ist?
Danke
kati
Hallo,
Wieso wird diese Exception geworfen, wo doch das version-Attribut definiert ist?
Bei mir funktioniert Dein Code anstandslos, allerdings verwendest Du offensichtlich eine GNU-Java-Implementierung (»at gnu.xml.transform.Stylesheet.doParse(libgcj.so.81)«) - und die scheint einen Bug zu haben.
Wenn Du genau hinsiehst, will der nämlich nicht ein Attribut "version", sondern ein Attribut "xsl:version" sehen. Das widerspricht zumindest beim Überfliegen der relevanten Abschnitte dem XSLT-1.0-Standard, denn der verlangt ein Attribut ohne Namespace (d.h. Du machst es richtig, Dein Prozessor ist verbuggt).
Du kannst es jetzt mal mit "xsl:version" probieren (und wenn's dumm geht musst Du alle Attribute mit "xsl:" präfixen) - allerdings solltest Du dann beachten, dass Deine XSLTs dann *INKOMPATIBEL* zu standardkonformen XSLT-Prozessoren werden.
Oder Du könntest versuchen, den XSLT-Prozessor zu wechseln - dazu kannst Du entweder eine andere Factory bei <xslt> angeben (alternativ die Systemeigenschaft javax.xml.transform.TransformerFactory ändern, was aber blöd ist bei Ant). Wenn Du z.B. XALAN verwenden willst müsstest Du folgendes tun (ungetestet):
<xslt ...>
<factory name="org.apache.xalan.processor.TransformerFactoryImpl" />
</xslt>
Oder, wenn Du kein TraX verwenden willst, den Prozessor aber dennoch wechseln willst: Ant bietet da mehrere Möglichkeiten, z.B. (für Xalan 2)
<xslt processor="xalan2" ... />
(auch ungetestet, sollte aber funktionieren)
Dafür muss natürlich der andere Prozessor installiert sein - Xalan kannst Du aber z.B. kostenlos herunterladen und verwenden.
Viele Grüße,
Christian
Hallo nochmal,
gerade mal in den Sourcecode geschaut:
Der Code sieht vollkommen korrekt aus, der GNU-Prozessor ist also NICHT buggy; die bei Dir auftretende Exception wird nur geworfen, wenn der Namespace des Root-Elements nicht http://www.w3.org/1999/XSL/Transform ist. Bist Du Dir sicher, dass
a) Das Root-Element (!) Deines XSLTs xsl:stylesheet ist
und
b) Der Namespace-URI des Root-Elements (!) wirklich
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" ist?
Alternativ auch <irgendwas:stylehseet und xmlns:irgendwas="http://www.w3.org/1999/XSL/Transform" - allerdings muss das Namespace-Präfix, d.h. "xsl" im ersten und "irgendwas" im zweiten Beispiel übereinstimmen!
Viele Grüße,
Christian
Hallo Christian,
danke für Dein Feedback. Ich beabsichtige ein zuvor generiertes XML in HTML zu überführen,
dafür habe ich einen Task eingerichtet, der zunächst das XML-Dokument erzeugt. Es ist übrigens
ein Standardbeispiel, nichts Ausgefallenes, siehe auch die Seite http://checkstyle.sourceforge.net/anttask.html.
Das Ant-Script schaut so aus:
<project name="checkstyle" default="checkstyle" basedir="." xmlns:cs="antlib:com.puppycrawl.tools.checkstyle">
<!-- checkstyle specific properties -->
<!-- svn specific properties -->
<!-- load taskdef for checkstyle -->
<taskdef resource="checkstyletask.properties" classpath="${checkstyle.jar}"/>
<!-- TARGET: checkstyle -->
<target name="checkstyle" description="Generates a report of code convention violations.">
<cs:checkstyle config="sun_checks.xml" failureProperty="checkstyle.failure" failOnViolation="false">
<formatter type="xml" tofile="checkstyle_report.xml"/>
<fileset dir="${svn.checkout.tmp}" casesensitive="yes">
<filename name="**/trunk/**/*.java"/>
</fileset>
</cs:checkstyle>
<xslt in="checkstyle_report.xml" out="checkstyle_report.html" style="contrib/checkstyle-simple.xsl"/>
</target>
</project>
Das erzeugte XML-File (erzgeugt durch cs:checkstyle) sieht etwa so aus:
<checkstyle version="5.0-beta01">
<file name="/data/Test.java">
<error line="0" severity="error" message="Missing package-info.java file." source="com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocPackageCheck"/>
</file>
</checkstyle>
Das zugehörige XSL:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head>
<title>Sun Coding Style Violations</title>
</head>
<body bgcolor="#FFFFEF">
<p><b>Coding Style Check Results</b></p>
<table border="1" cellspacing="0" cellpadding="2">
<tr bgcolor="#CC9966">
<th colspan="2"><b>Summary</b></th>
</tr>
<tr bgcolor="#CCF3D0">
<td>Total files checked</td>
<td><xsl:number level="any" value="count(descendant::file)"/></td>
</tr>
<tr bgcolor="#F3F3E1">
<td>Files with errors</td>
<td><xsl:number level="any" value="count(descendant::file[error])"/></td>
</tr>
<tr bgcolor="#CCF3D0">
<td>Total errors</td>
<td><xsl:number level="any" value="count(descendant::error)"/></td>
</tr>
<tr bgcolor="#F3F3E1">
<td>Errors per file</td>
<td><xsl:number level="any" value="count(descendant::error) div count(descendant::file)"/></td>
</tr>
</table>
<hr align="left" width="95%" size="1"/>
<p>The following are violations of the Sun Coding-Style Standards:</p>
<p/>
xsl:apply-templates/
</body>
</html>
</xsl:template>
<xsl:template match="file[error]">
<table bgcolor="#AFFFFF" width="95%" border="1" cellspacing="0" cellpadding="2">
<tr>
<th> File: </th>
<td>
<xsl:value-of select="@name"/>
</td>
</tr>
</table>
<table bgcolor="#DFFFFF" width="95%" border="1" cellspacing="0" cellpadding="2">
<tr>
<th> Line Number </th>
<th> Error Message </th>
</tr>
<xsl:apply-templates select="error"/>
</table>
<p/>
</xsl:template>
<xsl:template match="error">
<tr>
<td>
<xsl:value-of select="@line"/>
</td>
<td>
<xsl:value-of select="@message"/>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>
Die genannte Exception wird auch hier geworfen. Jetzt frage ich mich, was da nicht stimmt. Sieht mmN
definitiv nach einem Bug aus. Er beschwert sich definitiv über das version-Attribut im xsl:stylesheet.
Mit xsl:version="1.0" funktioniert es genauso wenig, seltsamerweise wird die gleiche Exception geworfen.
Fällt dir dazu noch was ein?
thx
kati
Hallo,
[Beispiel]
Die genannte Exception wird auch hier geworfen.
Funktioniert bei mir anstandslos - wenn ich das <cs:-Zeug weglasse und nur Deine Beispiel-Generierte-Datei nutze.
Jetzt frage ich mich, was da nicht stimmt. Sieht mmN
definitiv nach einem Bug aus. Er beschwert sich definitiv über das version-Attribut im xsl:stylesheet.
Mit xsl:version="1.0" funktioniert es genauso wenig, seltsamerweise wird die gleiche Exception geworfen.Fällt dir dazu noch was ein?
Ist wohl wirklich ein Bug bei Dir. Keine Ahnung... Evtl. ist der zu Grund liegende XML-Parser auch Buggy oder kann keine Namespaces oder die nicht richtig? Das würde das Verhalten auch erklären (wenn man den GNU-Source in Betracht zieht)...
Ansonsten: Schau Dir mein erstes Posting an: Anderen Processor verwenden. Xalan kann man wie gesagt problemlos nutzen, einfach in den Classpath knallen und dann sollte das auch schon laufen (mit den anderen Hinweisen, die ich Dir gegeben habe). Download unter http://xml.apache.org/xalan-j/downloads.html.
Viele grüße,
Christian
Hallo Christian,
ja, es muss wohl am buggy-parser liegen. ich habe ihn durch xalan2 ersetzt. Nun schaut der Task so aus (Ant 1.7):
<xslt classpath="${xalan2.classpath}" in="checkstyle_report.xml" out="checkstyle_report.html" style="contrib/checkstyle-simple.xsl">
<factory name="org.apache.xalan.processor.TransformerFactoryImpl">
<attribute name="http://xml.apache.org/xalan/features/optimize" value="true"/>
</factory>
</xslt>
der Pfad zum Xalan2 muss auch im Classpath vorhanden sein oder per -lib parameter beim Ausführen von Ant übergeben werden:
ant -buildfile build.xml -lib $checkstyle_jar:$xalan_jar
Jetzt funktionierts.
danke
kati
Hallo,
[Beispiel]
Die genannte Exception wird auch hier geworfen.Funktioniert bei mir anstandslos - wenn ich das <cs:-Zeug weglasse und nur Deine Beispiel-Generierte-Datei nutze.
Jetzt frage ich mich, was da nicht stimmt. Sieht mmN
definitiv nach einem Bug aus. Er beschwert sich definitiv über das version-Attribut im xsl:stylesheet.
Mit xsl:version="1.0" funktioniert es genauso wenig, seltsamerweise wird die gleiche Exception geworfen.Fällt dir dazu noch was ein?
Ist wohl wirklich ein Bug bei Dir. Keine Ahnung... Evtl. ist der zu Grund liegende XML-Parser auch Buggy oder kann keine Namespaces oder die nicht richtig? Das würde das Verhalten auch erklären (wenn man den GNU-Source in Betracht zieht)...
Ansonsten: Schau Dir mein erstes Posting an: Anderen Processor verwenden. Xalan kann man wie gesagt problemlos nutzen, einfach in den Classpath knallen und dann sollte das auch schon laufen (mit den anderen Hinweisen, die ich Dir gegeben habe). Download unter http://xml.apache.org/xalan-j/downloads.html.
Viele grüße,
Christian