【问题标题】:How to apply xsl to xml in Java如何在 Java 中将 xsl 应用于 xml
【发布时间】:2011-08-24 02:03:42
【问题描述】:

这可能被问了很多次,但我并没有真正找到我想要的东西。 我通常不使用 Java 编写代码,但使用 C# 编写代码,因此我对 Java 类等不太满意。

问题

我需要创建一个需要 2 个参数的方法。 1.一个字符串参数(xml - 所以需要转换为一些xml类) 2.带有xsl文件路径位置的字符串参数

问题是我正在创建一个工厂类,它必须将 xml 从 web 服务转换为我的系统可以理解的 xml。我需要一个很好的解决方案。 ws 上的每个方法都会有一个 xsl 文件——请求(将我的 xml 转换为 ws 可以理解的内容)和响应(转换为我的系统可以理解的内容)。

【问题讨论】:

  • 标题为XSL,问题本身和标签为XLS。我猜你的意思是XSLXLS 是 MS Excel 文件格式)。

标签: java xml xslt


【解决方案1】:

看看http://www.rgagnon.com/javadetails/java-0407.html,希望能回答你的问题

【讨论】:

    【解决方案2】:

    您可能会发现 Java Almanac 是一种有用的资源。

    尤其是The Quintessential Program That Transforms an XML File with XSL。从页面复制的示例(因为它不断消失)

    import java.io.*;
    import org.w3c.dom.*;
    import org.xml.sax.*;
    import javax.xml.parsers.*;
    import javax.xml.transform.*;
    import javax.xml.transform.dom.*;
    import javax.xml.transform.stream.*;
    
    public class BasicXsl {
        // This method applies the xslFilename to inFilename and writes
        // the output to outFilename.
        public static void xsl(String inFilename, String outFilename, String xslFilename) {
            try {
                // Create transformer factory
                TransformerFactory factory = TransformerFactory.newInstance();
    
                // Use the factory to create a template containing the xsl file
                Templates template = factory.newTemplates(new StreamSource(
                    new FileInputStream(xslFilename)));
    
                // Use the template to create a transformer
                Transformer xformer = template.newTransformer();
    
                // Prepare the input and output files
                Source source = new StreamSource(new FileInputStream(inFilename));
                Result result = new StreamResult(new FileOutputStream(outFilename));
    
                // Apply the xsl file to the source file and write the result
                // to the output file
                xformer.transform(source, result);
            } catch (FileNotFoundException e) {
            } catch (TransformerConfigurationException e) {
                // An error occurred in the XSL file
            } catch (TransformerException e) {
                // An error occurred while applying the XSL file
                // Get location of error in input file
                SourceLocator locator = e.getLocator();
                int col = locator.getColumnNumber();
                int line = locator.getLineNumber();
                String publicId = locator.getPublicId();
                String systemId = locator.getSystemId();
            }
        }
    }
    

    示例输入:

    <?xml version="1.0" encoding="UTF-8"?>
    <map>
        <entry key="key1" value="value1" />
        <entry key="key2" />
    </map>
    

    示例 XSLT 程序:

    <?xml version="1.0"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
      <xsl:output method="html" indent="yes"/>
    
    <xsl:template match="map">
    <HTML>
    <HEAD>
    <TITLE>Map</TITLE>
    </HEAD>
    <BODY>
        <xsl:apply-templates/>
    </BODY>
    </HTML>
    </xsl:template>
    
    
    <xsl:template match="entry">
        <xsl:value-of select="@key"/>=<xsl:value-of select="@value"/>
        <br></br>
    </xsl:template>
    
    
    </xsl:stylesheet>
    

    运行示例生成的 HTML 是:

    <HTML>
    <HEAD>
    <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <TITLE>Map</TITLE>
    </HEAD>
    <BODY>
        key1=value1<br>
        key2=<br>
    
    </BODY>
    </HTML>
    

    【讨论】:

    【解决方案3】:

    “JAXP 教程”的 Google - 有很多可用资源。

    尽管如果您想使用 XSLT 2.0(相信我,您会这样做!),您将使用 Saxon,并且 Saxon 提供 JAXP 和它自己的 API(称为 s9api),它可以帮助您利用所有新的XSLT 2.0 中的功能。

    【讨论】:

    • 即使我承认你在这个问题上的权威,“相信我,你愿意”的论点可能会被一个简短的独立解释所取代,解释为什么它会好得多。就个人而言,我们可以在 99% 的情况下使用 XSLT 1.0,它存在于标准 Java 运行时中。此外,您可能还想提一下,真正有趣的撒克逊版本是有代价的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    相关资源
    最近更新 更多