使用XSL文件层次结构进行XSLT转换

时间:2017-03-09 01:14:59

标签: xml xslt xslt-2.0

所以我试图将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文件吗?

1 个答案:

答案 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)避免昂贵的类路径搜索。