如何在 Java 中将 xsl 应用于 xml

Posted

技术标签:

【中文标题】如何在 Java 中将 xsl 应用于 xml【英文标题】:How to apply xsl to xml in Java 【发布时间】: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 文件格式)。 XSLT processing with Java?的可能重复 【参考方案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>

【讨论】:

我认为样本没问题,但它会将文件输出到磁盘。我可能需要它在内存流中,然后最终将它作为字符串返回(可能通过逐位遍历流?) 看看 StreamResult 类。 似乎被域名抢注了。我不知道他们去了哪里。 链接在这里有效:exampledepot.8waytrips.com/egs/javax.xml.transform/… StreamResult 与 Transformer 结合使用的示例:***.com/a/852010/2049986【参考方案3】:

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

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

【讨论】:

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

以上是关于如何在 Java 中将 xsl 应用于 xml的主要内容,如果未能解决你的问题,请参考以下文章

如何将xsl文件转换为sef文件

Java+XSL合并多个XML文件

应用于 XML 文件时 XSL 不返回值

如何在 Java 中从 XML 创建 PDF?

如何通过 XSL FO 将小型大写字母应用于字符串

Chrome不会将我的XSLT样式表应用于我的本地XML文件