gpt4 book ai didi

JAVA:两步 View 模式:我们如何使用两个 XSL 文件将转换 View 转换为两步 View 以获得所需的 HTML 输出?‽

转载 作者:行者123 更新时间:2023-11-30 06:17:02 34 4
gpt4 key购买 nike

您好,感谢您阅读此问题:

我正在研究企业架构模式,并且我已经实现了转换 View 之一:

Java: Implementing Transform View pattern, to convert XML to HTML with an XSL file

首先,在前 10 张幻灯片中,我将描述我所学到的内容,然后是从书籍中获取的示例,最后是我尝试自己实现它的方法,以及我对 Java 代码的疑问:

我研究了UML中是如何描述的,一个例子是,(图片取自老师的类(class)):

我们有一个专辑,它被读取然后转换为中间格式,然后以通用方式处理:

enter image description here

更详细地说,如果我们有一个商店页面,每个订单都会有行项目,并且这些项目将转换为我们的格式文件:订单第一阶段。然后生成的表及其行将被转换为 HTML,而不知道它来自哪里:

enter image description here

那么这意味着 Controller 在第一阶段创建我们的订单,即我们的格式文件。然后,我们获取订单数据和行项目数据以创建带有行的新表。之后, Controller 创建第二阶段,获取表和行,并将它们添加到响应 HTML 中:

enter image description here

我们有兴趣学习这种模式的原因是,它是一种在单个位置转换我们所有网络应用程序样式的便捷方法:

enter image description here

在上一张幻灯片中,我们看到如何只需要更改 Second Stage XSL 文件即可在所有应用程序页面中显示新样式。

深入地说,我们可以互换任何新的 XSL 以及我们想要投入生产的应用程序样式:

enter image description here

作为从书籍中摘录的示例,我们在这里看到一个专辑:

enter image description here

因此,第一阶段 XSL 会将专辑的 XML 标签转换为中间格式,并具有更通用的标签,例如:屏幕、表格、行...

enter image description here

经过上述转换后,输出 XML 将是:

enter image description here

此外,我们有兴趣在第二阶段使用单个点处理通用 XML:

enter image description here

完成前面的所有步骤后,我们最终需要在 Java 中实现逻辑,正如示例给我们提供的线索,它看起来像:

enter image description here

然后,我尝试了以下方法:

首先,我们有代表虚构学生信息的 XML:

<?xml version="1.0"?>
<ALUMNO>
<NOMBRE>Luis</NOMBRE>
<APELLIDO1>Navarro</APELLIDO1>
<APELLIDO2>Morote</APELLIDO2>
<ASIGNATURAS>
<ASIGNATURA>PR4</ASIGNATURA>
<NOTA>5</NOTA>
<ASIGNATURA>BD2</ASIGNATURA>
<NOTA>8</NOTA>
<ASIGNATURA>IR</ASIGNATURA>
<NOTA>10</NOTA>
</ASIGNATURAS>
</ALUMNO>

然后我们执行第一阶段 XSL 将学生的标签转换为中间文件格式:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet
xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform"
version="1.0"
>

<xsl:template match="ALUMNO">
<table>
<xsl:apply-template/>
</table>
</xsl:template>

<xsl:template match="NOMBRE">
<firstCell>
<xsl:apply-templates/>
</firstCell>
</xsl:template>

<xsl:template match="APPELLIDO1">
<secondCell>
<xsl:apply-templates/>
</secondCell>
</xsl:template>

<xsl:template match="APPELLIDO2">
<thirdCell>
<xsl:apply-templates/>
</thirdCell>
</xsl:template>


<xsl:template match="ASIGNATURA">
<fourthCell>
<xsl:apply-templates/>
</fourthCell>
</xsl:template>

<xsl:template match="NOTA">
<fifthCell>
<xsl:apply-templates/>
</fifthCell>
</xsl:template>



</xsl:stylesheet>

在上一步之后,我们使用第二阶段处理通用标签,以我们想要的方式设置样式,如表格:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet
xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform"
version="1.0"
>

<xsl:template match="/">
<html>
<head>
<title>LISTA DE ALUMNOS</title>
</head>
<body bgColor="black" text="white">
<table>
<tr>
<th colspan="4">Nombre</th>
<th colspan="3">Primer apellido</th>
<th colspan="3">Segundo apellido</th>
<th colspan="2">Asignatura</th>
<th colspan="2">Nota</th>
</tr>
<xsl:apply-templates />
</table>
</body>
</html>
</xsl:template>

<xsl:template match="table">
<tr>
<td colspan="4">
<xsl:value-of select="firstCell" />
</td>
<td colspan="3">
<xsl:value-of select="secondCell" />
</td>
<td colspan="3">
<xsl:value-of select="thirdCell" />
</td>
<td colspan="2">
<xsl:value-of select="fourthCell" />
</td>
<td colspan="2">
<xsl:value-of select="fifthCell" />
</td>
</tr>
</xsl:template>


<xsl:template match="firstCell">
<P>
<B>Nombre: </B>
<TR>
<xsl:apply-templates/>
</TR>
</P>
</xsl:template>

<xsl:template match="fourthCell">
<h1>Aginatura: </h1>
<xsl:apply-templates/>
</xsl:template>

<xsl:template match="fifthCell">
<h2>Nota: </h2>
<xsl:apply-templates/>
</xsl:template>

<xsl:output method="html"/>

</xsl:stylesheet>

现在我们的疑问来了:如何将第一阶段的XSL转换原始XML的结果,使用第二阶段的XSL输出我们想要的HTML?

我已经尝试过:

/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package frontController;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.transform.Result;
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;

/**
*
* @author YonePC
*/
@WebServlet(name = "AlumnosCommand", urlPatterns = {"/AlumnosCommand"})
public class AlumnosCommand extends FrontCommand {

/**
* Processes requests for both HTTP <code>GET</code> and <code>POST</code>
* methods.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

}

// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
/**
* Handles the HTTP <code>GET</code> method.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

/**
* Handles the HTTP <code>POST</code> method.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

/**
* Returns a short description of the servlet.
*
* @return a String containing servlet description
*/
public String getServletInfo() {
return "Short description";
}// </editor-fold>

@Override
public void process(HttpServletRequest request) {
try {

TransformerFactory factory = TransformerFactory.newInstance();
StreamSource xslFirstStage = new StreamSource(new File("C:\\Users\\YonePC\\Videos\\ASAPLICACIONCURSOSPRACTICA1\\src\\java\\frontController\\FirstStageAlumnos.xsl"));
StreamSource xslSecondStage = new StreamSource(new File("C:\\Users\\YonePC\\Videos\\ASAPLICACIONCURSOSPRACTICA1\\src\\java\\frontController\\Alumnos.xsl"));
Transformer firstTransformer = factory.newTransformer(xslFirstStage);
Transformer secondTransformer = factory.newTransformer(xslSecondStage);

StreamSource xml = new StreamSource(new File("C:\\Users\\YonePC\\Videos\\ASAPLICACIONCURSOSPRACTICA1\\src\\java\\frontController\\Alumnos.xml"));
PrintWriter writer = response.getWriter();
Result result = new StreamResult(writer);


OutputStream afterFirstStage = new FileOutputStream("C:\\Users\\YonePC\\Videos\\ASAPLICACIONCURSOSPRACTICA1\\src\\java\\frontController\\afterFirstStage.xsl");
firstTransformer.transform(xml, new StreamResult(afterFirstStage));
secondTransformer.transform(afterFirstStage, xslSecondStage);
writer.println(writer.toString());

} catch (IOException ioe) {
ioe.printStackTrace();
} catch (TransformerException te) {
te.printStackTrace();

}
}

}

正如 IDE 所说,当我们使用 Transformer.transform() 时,第一个参数应该是 Source,第二个参数应该是 StreamSource。

IDE 在这里显示:不兼容的类型:无法将 OutputStream 转换为 Source。

enter image description here

你能帮我一下吗?

我也读过自己做:How to convert XML to HTML using XSLT in Java

http://www.javased.com/index.php?api=javax.xml.transform.Result

最佳答案

如果您想使用中间文件,那么您当然需要在第一次转换后关闭该输出流,并在您创建的文件上打开一个新的 StreamSource ,然后将其用作第二次转换的输入。

使用基于 JAXP 和 SAX 的 Transformer,您可以避免使用中间文件,而只需设置一些处理程序 ( https://docs.oracle.com/javase/8/docs/api/javax/xml/transform/sax/SAXTransformerFactory.html ),例如

TransformerHandler tfh = (SAXTransformerFactory)transformerFactory.newInstance().newTransformer(new StreamSource("second.xsl"));
tfh.setResult(new StreamResult("finalOutput.xml"));

firstTransformer.transform(inputSource, new SAXResult(tfh));

关于JAVA:两步 View 模式:我们如何使用两个 XSL 文件将转换 View 转换为两步 View 以获得所需的 HTML 输出?‽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48971189/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com