如何在Java中将xsl应用到xml

发布于 2024-11-06 08:39:30 字数 342 浏览 0 评论 0原文

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

问题

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

事情是我正在制作一个工厂类,它必须将 xml 从 webservice 转换为我的系统可以理解的 xml。我需要一个很好的解决方案。 ws 上的每个方法都会有一个 xsl 文件 - 请求(将我的 xml 转换为 ws 可以理解的内容)和响应(转换为我的系统可以理解的内容)。

This is problaby been asked a bunch of times, but I didn't really find what I was looking for exactly.
I don't normally code in Java, but in C# so I am not comfortable with Java classes and such.

Question

I need to create a method that takes 2 paramaters.
1. A string parameter (the xml - so needs to be converted to some xml class)
2. A string parameter with the xsl file path location

The thing is I am making a factory class that must convert xml from a webservice into xml that my system can understand. I need a nice solution for that.
Every method on the ws will have a xsl file - both the request (convert my xml to something that the ws understands) and the response (convert to something that my system understands).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

○愚か者の日 2024-11-13 08:39:30

您可能会发现 Java 年鉴是一个有用的资源。

尤其是使用 XSL 转换 XML 文件的典型程序 。从页面复制的示例(因为它不断消失)

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>

You might find the Java Almanac a useful resource.

notably The Quintessential Program That Transforms an XML File with XSL. Example copied from the page (as it keeps disappearing)

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();
        }
    }
}

Sample input:

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

Sample XSLT program:

<?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>

The resulting HTML from running the example is:

<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>
姜生凉生 2024-11-13 08:39:30

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

不过,如果您想使用 XSLT 2.0(相信我,您会这样做!),您将使用 Saxon,而 Saxon 提供 JAXP 及其自己的 API(称为 s9api),这可以帮助您利用 XSLT 中的所有新功能2.0。

Google for "JAXP tutorial" - there are lots of resources available.

Though if you want to use XSLT 2.0 (and believe me, you do!), you'll be using Saxon, and Saxon offers both JAXP and its own API (called s9api) which helps you take advantage of all the new features in XSLT 2.0.

ㄟ。诗瑗 2024-11-13 08:39:30

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

Have a look at http://www.rgagnon.com/javadetails/java-0407.html, hope that answers your question

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文