请事先原谅我的英语,我的母语是法语。
我目前正致力于程序的自动邮件功能。 我必须改进一个像这样工作的现有功能: - 用户(我实习的公司的工作人员)想要向客户发送电子邮件 - 选择电子邮件的类型(例如:欢迎,部署,计费) - 然后获取一个表单,该表单自动预填充与从SQL数据库检索的客户端相关的数据 - 如果需要,他可以更改一些信息(例如添加cc),然后验证表单 - 表单生成一个XML文件,该文件是"链接"根据邮件的类型,适当的XSL。 - XSL文件将XML转换为HTML文件,并将最终的电子邮件发送给客户端。
问题是该公司正在更改电子邮件的图形模板。我是实习生,他必须更改每个XSL文件以匹配新模板。我也被要求考虑一种更有效的方法。
我想要做的是分离内容和布局/样式(与CSS文件一样)。
我想要第一个XSL将表单数据转换为第二个XML(包含所有内容),然后使用第二个XSL文件(用于样式)将其转换为最终的html文件。因此,第二个XSL是唯一需要在未来模板更改时进行编辑的文件。
以下是一个简化示例。
从表单自动生成XML:
<root>
<typeMail>Prise de contact</typeMail>
<numCommand>X8374</numCommand>
<offer>hmm</offer>
<emailClient>blabla@blabla</emailClient>
<contactName>toto</contactName>
</root>
第一次转型的第二个XML:
<email>
<emailClient>blabla@blabla</emailClient>
<Header>
<title> Welcome <title>
<object>
Welcome Mr. <clientData> toto </clientData>. Thanks for subscribing to <commandData>hmm</commandData>
</object>
</header>
<main>
Your command id is <commandData>X8374</commandData>
</main>
</email>
第二种方式 - XSL然后将第二个XML转换为最终的HTML文件。
我的第一个问题是:这是一个很好的解决方案吗? 第二个问题:我已开始测试解决方案,但无法获得第二个xml&#34;自动转换为html。我得到第二个xml。当我保存并在浏览器中重新打开它现在它转换成最终的HTML。有没有办法在不使用任何其他工具,代码或脚本的情况下完成它? 这可能是一个愚蠢的问题,但如果可能的话会很好。
以下是我的测试文件:
第一个XML :
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="test.xsl" ?>
<persons>
<person username="JS1">
<name>John</name>
<family-name>Smith</family-name>
</person>
<person username="MI1">
<name>Morka</name>
<family-name>Ismincius</family-name>
</person>
</persons>
首先是XSL :
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/persons">
<xsl:processing-instruction name="xml-stylesheet">type="text/xsl" href="test2.xsl"</xsl:processing-instruction>
<root>
<xsl:apply-templates select="person"/>
</root>
</xsl:template>
<xsl:template match="person">
<name username="{@username}">
<xsl:value-of select="name" />
</name>
</xsl:template>
</xsl:stylesheet>
这给了我:
<?xml version="1.0" encoding="UTF-16"?>
<?xml-stylesheet type="text/xsl" href="test2.xsl"?>
<root>
<name username="JS1">John</name>
<name username="MI1">Morka</name>
</root>
第二个XSL (一个愚蠢的人):
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head></head>
<body style="font-family:Verdana; font-size:18pt; color:green">
blablabla
<xsl:apply-templates />
blablabla
</body>
</html>
</xsl:template>
<xsl:template match="name">
<p style="font-family:Verdana; font-size:30pt; color:red">
blibli
</p>
</xsl:template>
我知道我理论上可以打开一个带有javascript脚本的html文件来进行转换,但我想知道是否可以在没有它的情况下完成。我想它只是中间的xml文件存储在一个临时文件夹中,并没有找到第二个XSL文件的路径,但我不知道如何解决问题......
如果真的没有别的办法,我应该使用这样的剧本吗? (第一个脚本。我把它放在一个空的html文件的正文中。经过测试,没有工作..不知道为什么......) 那样的东西?
<script type="text/javascript">
//load xml
var xml1 = new ActiveXObject("Microsoft.XMLDOM")
xml1.async = false
xml1.load("xml1.xml")
//load first xsl
var xsl1 = new ActiveXObject("Microsoft.XMLDOM")
xsl1.async = false
xsl1.load("xsl1.xsl")
//transform first xml
var xml2 = new ActiveXObject("Microsoft.XMLDOM")
xml2.async = false
xml2.write(xml1.transformNode(xsl1)) //not sure of the proper function
//load second xml
var xsl2 = new ActiveXObject("Microsoft.XMLDOM")
xsl2.async = false
xsl2.load("xsl2.xsl")
//final html
document.write(xml2.transformNode(xsl2))
</script>