所以我试图将XML文件转换为HTML;它是客户网站中生成的一个,它具有与之关联的XSL文件的复杂层次结构,用于转换。例如spl.xsl
引用spl-common.xsl
,后者又引用了许多其他XSL文件
我已经看过几种转换它的方法;尝试在命令行上运行xmlto
,我收到编译错误:
file /home/name/Downloads/MedicalXmlTransform/xml-verbatim.xsl第1行元素转换xsl:version:仅支持1.0个功能
似乎它不支持任何超过XSLT 1.0的内容
我尝试运行saxonb-xslt
(XSLT-2.0处理器),但我得到了同样的错误。
我尝试创建一个简单的Java应用程序来执行它:
import javax.xml.transform.ErrorListener;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
public class HowToXSLT {
public static void main(String[] args)
{
/*if (args.length != 3)
{
System.err.println("give command as follows : ");
System.err.println("XSLTTest data.xml converted.xsl converted.html");
return;
}*/
String dataXML = "resources/xml/ba97d0d9-67c4-4f45-ae9e-9f4263b9ec62.xml";
String inputXSL = "resources/xsl/spl.xsl";
String outputHTML = "resources/xml/output1.html";
HowToXSLT st = new HowToXSLT();
try
{
st.transform(dataXML, inputXSL, outputHTML);
}
catch (TransformerConfigurationException e)
{
System.err.println("TransformerConfigurationException");
System.err.println(e);
}
catch (TransformerException e)
{
System.err.println("TransformerException");
System.err.println(e);
}
}
public void transform(String dataXML, String inputXSL, String outputHTML)
throws TransformerConfigurationException,
TransformerException
{
TransformerFactory factory = TransformerFactory.newInstance();
StreamSource xslStream = new StreamSource(inputXSL);
Transformer transformer = factory.newTransformer(xslStream);
StreamSource in = new StreamSource(dataXML);
StreamResult out = new StreamResult(outputHTML);
transformer.transform(in, out);
System.out.println("The generated HTML file is:" + outputHTML);
}
同样没有骰子 - 我得到ClassCast
例外:
java.lang.ClassCastException:
com.sun.org.apache.xalan.internal.xsltc.compiler.Param无法强制转换为com.sun.org.apache.xalan.internal.xsltc.compiler.Variable
我知道我在尝试命令行解决方案以及Java程序的所有地方 - 但我只需要将其转换。 XML本身调用一个XSLT文件,该文件又引用了另外5个和一些XML文件。
它不像一个XSLT文件那么简单 - 那里的任何人都知道如何使用XSLT层次结构翻译XML文件吗?
答案 0 :(得分:0)
首先,您对使用XSLT 2.0的要求与使用“XSLT文件层次结构”的任何要求无关。 xsl:include和xsl:import声明在XSLT 1.0和2.0之间几乎没有变化。
假设您确实需要XSLT 2.0(由于与此无关的原因),那么使用Saxon运行转换是正确的方法。如果您尝试了这个并且它失败了,那么您需要准确地告诉我们您是如何尝试它以及它是如何失败的,因为您做错了什么而我们无法分辨出什么。
如果要使用JAXP API运行XSLT 2.0样式表,请不要使用
TransformerFactory factory = TransformerFactory.newInstance();
因为这会找到它在类路径中找到的任何XSLT处理器。而是使用
TransformerFactory factory = new net.sf.saxon.TransformerFactorImpl();
代表Saxon-HE,或
TransformerFactory factory = com.saxonica.config.EnterpriseConfigurationFactory();
对于Saxon-EE。这(a)确保您获得满足处理要求的XSLT处理器,以及(b)避免昂贵的类路径搜索。