使用两个XSL文件将XML转换为XML到

时间:2016-03-29 13:29:46

标签: xml xslt

请事先原谅我的英语,我的母语是法语。

我目前正致力于程序的自动邮件功能。 我必须改进一个像这样工作的现有功能:       - 用户(我实习的公司的工作人员)想要向客户发送电子邮件       - 选择电子邮件的类型(例如:欢迎,部署,计费)       - 然后获取一个表单,该表单自动预填充与从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>

0 个答案:

没有答案