Xml 具有XSL文件层次结构的XSLT转换

Xml 具有XSL文件层次结构的XSLT转换,xml,xslt,xslt-2.0,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功能 它似乎不支持任何超过XSLT1.0的内

因此,我试图将XML文件转换为HTML;它是从客户端网站生成的,它有一个复杂的XSL文件层次结构,与之关联,用于转换。例如,
spl.xsl
引用了
spl common.xsl
,它又引用了许多其他xsl文件。
我已经研究了几种转换它的方法;尝试在命令行上运行
xmlto
,但出现编译错误:

file/home/name/Downloads/MedicalXmlTransform/xml-verbatim.xsl第1行元素转换xsl:version:仅支持1.0功能

它似乎不支持任何超过XSLT1.0的内容。
我试着运行
saxonbxslt
(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文件吗?

首先,您使用XSLT 2.0的要求与使用“XSLT文件层次结构”的要求无关。xsl:include和xsl:import声明在XSLT1.0和2.0之间几乎没有变化

假设您确实需要XSLT2.0(由于与此无关的原因),那么使用Saxon运行转换是正确的方法。如果你试图这样做,但失败了,那么你需要准确地告诉我们你是如何尝试的,以及它是如何失败的,因为你做错了什么,我们不知道是什么

如果希望使用JAXP API运行XSLT2.0样式表,那么不要使用

TransformerFactory factory = TransformerFactory.newInstance();
因为这将拾取它在类路径上发现的任何XSLT处理器。改用

TransformerFactory factory = new net.sf.saxon.TransformerFactorImpl();
对于撒克逊人,他,或者

TransformerFactory factory = com.saxonica.config.EnterpriseConfigurationFactory();

对于撒克逊人来说。这(a)确保获得满足处理要求的XSLT处理器,以及(b)避免了昂贵的类路径搜索。

提供您的确切问题的详细信息。感谢您的响应,这是我针对saxon的命令行:user@host:~/Downloads/MedicalXmlTransform$saxonb xslt ba97d0d9-67c4-4f45-ae9e-9f4263b9ec62.xml spl.xsl这是输出:警告:在spl.xsl第26行第138列的xsl:transform处:运行xslt 1.0spl-common.xsl:SESU0013第623行出现XSLT 2.0处理器错误的样式表:xsl:apply templates(文件:/home/user/Downloads/MedicalXmlTransform/spl common.xsl#107)处不支持的HTML版本:1.0处理/文档转换失败:报告了运行时错误这意味着您的原始问题已解决,现在您已转到下一个(不相关)问题。如果您不理解请求HTML version=“1.0”如何是一个错误,请提出另一个问题。