- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
您好,感谢您阅读此问题:
我正在研究企业架构模式,并且我已经实现了转换 View 之一:
Java: Implementing Transform View pattern, to convert XML to HTML with an XSL file
首先,在前 10 张幻灯片中,我将描述我所学到的内容,然后是从书籍中获取的示例,最后是我尝试自己实现它的方法,以及我对 Java 代码的疑问:
我研究了UML中是如何描述的,一个例子是,(图片取自老师的类(class)):
我们有一个专辑,它被读取然后转换为中间格式,然后以通用方式处理:
更详细地说,如果我们有一个商店页面,每个订单都会有行项目,并且这些项目将转换为我们的格式文件:订单第一阶段。然后生成的表及其行将被转换为 HTML,而不知道它来自哪里:
那么这意味着 Controller 在第一阶段创建我们的订单,即我们的格式文件。然后,我们获取订单数据和行项目数据以创建带有行的新表。之后, Controller 创建第二阶段,获取表和行,并将它们添加到响应 HTML 中:
我们有兴趣学习这种模式的原因是,它是一种在单个位置转换我们所有网络应用程序样式的便捷方法:
在上一张幻灯片中,我们看到如何只需要更改 Second Stage XSL 文件即可在所有应用程序页面中显示新样式。
深入地说,我们可以互换任何新的 XSL 以及我们想要投入生产的应用程序样式:
作为从书籍中摘录的示例,我们在这里看到一个专辑:
因此,第一阶段 XSL 会将专辑的 XML 标签转换为中间格式,并具有更通用的标签,例如:屏幕、表格、行...
经过上述转换后,输出 XML 将是:
此外,我们有兴趣在第二阶段使用单个点处理通用 XML:
完成前面的所有步骤后,我们最终需要在 Java 中实现逻辑,正如示例给我们提供的线索,它看起来像:
然后,我尝试了以下方法:
首先,我们有代表虚构学生信息的 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。
你能帮我一下吗?
我也读过自己做: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/
我正在尝试将一个字符串逐个字符地复制到另一个字符串中。目的不是复制整个字符串,而是复制其中的一部分(我稍后会为此做一些条件......) 但我不知道如何使用迭代器。 你能帮帮我吗? std::stri
我想将 void 指针转换为结构引用。 结构的最小示例: #include "Interface.h" class Foo { public: Foo() : mAddress((uint
这有点烦人:我有一个 div,它从窗口的左上角开始过渡,即使它位于文档的其他任何位置。我试过 usign -webkit-transform-origin 但没有成功,也许我用错了。有人可以帮助我吗?
假设,如果将 CSS3 转换/转换/动画分配给 DOM 元素,我是否可以检测到该过程的状态? 我想这样做的原因是因为我正在寻找类似过渡链的东西,例如,在前一个过渡之后运行一个过渡。 最佳答案 我在 h
最近我遇到了“不稳定”屏幕,这很可能是由 CSS 转换引起的。事实上,它只发生在 Chrome 浏览器 上(可能还有 Safari,因为一些人也报告了它)。知道如何让它看起来光滑吗?此外,您可能会注意
我正在开发一个简单的 slider ,它使用 CSS 过渡来为幻灯片设置动画。我用一些基本样式和一些 javascript 创建了一支笔 here .注意:由于 Codepen 使用 Prefixfr
我正在使用以下代码返回 IList: public IList FindCodesByCountry(string country) { var query =
如何设计像这样的操作: 计算 转化 翻译 例如:从“EUR”转换为“CNY”金额“100”。 这是 /convert?from=EUR&to=CNY&amount=100 RESTful 吗? 最佳答
我使用 jquery 组合了一个图像滚动器,如下所示 function rotateImages(whichHolder, start) { var images = $('#' +which
如何使用 CSS (-moz-transform) 更改一个如下所示的 div: 最佳答案 你可以看看Mozilla Developer Center .甚至还有例子。 但是,在我看来,您的具体示例不
我需要帮助我正在尝试在选中和未选中的汉堡菜单上实现动画。我能够为菜单设置动画,但我不知道如何在转换为 0 时为左菜单动画设置动画 &__menu { transform: translateX(
我正在为字典格式之间的转换而苦苦挣扎:我正在尝试将下面的项目数组转换为下面的结果数组。本质上是通过在项目第一个元素中查找重复项,然后仅在第一个参数不同时才将文件添加到结果集中。 var items:[
如果我有两个定义相同的结构,那么在它们之间进行转换的最佳方式是什么? struct A { int i; float f; }; struct B { int i; float f; }; void
我编写了一个 javascript 代码,可以将视口(viewport)从一个链接滑动到另一个链接。基本上一切正常,你怎么能在那里看到http://jsfiddle.net/DruwJ/8/ 我现在的
我需要将文件上传到 meteor ,对其进行一些图像处理(必要时进行图像转换,从图像生成缩略图),然后将其存储在外部图像存储服务器(s3)中。这应该尽可能快。 您对 nodejs 图像处理库有什么建议
刚开始接触KDB+,有一些问题很难从Q for Mortals中得到。 说,这里 http://code.kx.com/wiki/JB:QforMortals2/casting_and_enumera
我在这里的一个项目中使用 JSF 1.2 和 IceFaces 1.8。 我有一个页面,它基本上是一大堆浮点数字段的大编辑网格。这是通过 inputText 实现的页面上的字段指向具有原始值的值对象
ScnMatrix4 是一个 4x4 矩阵。我的问题是什么矩阵行对应于位置(ScnVector3),旋转(ScnVector4),比例(ScnVector3)。第 4 行是空的吗? 编辑: 我玩弄了
恐怕我是 Scala 新手: 我正在尝试根据一些简单的逻辑将 Map 转换为新 Map: val postVals = Map("test" -> "testing1", "test2" -> "te
输入: This is sample 1 This is sample 2 输出: ~COLOR~[Green]This is sample 1~COLOR~[Red]This is sam
我是一名优秀的程序员,十分优秀!