Как применить xsl к xml в Java - PullRequest
8 голосов
/ 12 мая 2011

Об этом, наверное, спрашивали много раз, но я не нашел именно то, что искал. Я обычно не пишу код на Java, но на C #, поэтому я не чувствую себя комфортно с классами Java и тому подобным.

Вопрос

Мне нужно создать метод, который принимает 2 параметра. 1. Строковый параметр (xml - поэтому необходимо преобразовать в некоторый класс xml) 2. Строковый параметр с расположением пути файла xsl

Дело в том, что я создаю фабричный класс, который должен конвертировать xml из веб-сервиса в xml, который может понять моя система. Мне нужно хорошее решение для этого. У каждого метода в ws будет файл xsl - и запрос (преобразовать мой xml во что-то, что понимает ws) и ответ (преобразовать в то, что понимает моя система).

Ответы [ 3 ]

17 голосов
/ 12 мая 2011

Вы можете найти Java-альманах полезным ресурсом.

, в частности, Наиболее существенная программа, которая преобразует XML-файл с помощью 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>
1 голос
/ 12 мая 2011

Google для "JAXP tutorial" - доступно множество ресурсов.

Хотя, если вы хотите использовать XSLT 2.0 (и поверьте мне, вы делаете!), Вы будете использовать Saxon и Saxonпредлагает как JAXP, так и собственный API (называемый s9api), который помогает вам воспользоваться всеми новыми функциями XSLT 2.0.

0 голосов
/ 12 мая 2011

Посмотрите на http://www.rgagnon.com/javadetails/java-0407.html, надеюсь, что ответит на ваш вопрос

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...