Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用XSLT将XML转换为HTML_C#_Html_Xml_Xslt_Asp.net 3.5 - Fatal编程技术网

C# 使用XSLT将XML转换为HTML

C# 使用XSLT将XML转换为HTML,c#,html,xml,xslt,asp.net-3.5,C#,Html,Xml,Xslt,Asp.net 3.5,我在stackoverflow上看到了几个与XML、XSLT和HTML相关的问题,但我觉得我的问题有点不同。以下是我需要的: 我需要给我的客户发一封电子邮件。电子邮件的措辞可能因场景而异。每个场景都有相应的格式保存在数据库中。例如,一个场景可能需要此电子邮件: 场景1:我们已经为您的XXX电话开通了票证XXX/参考号XXX。请致电XXX与我们联系,以跟踪进度 另一种情况可能需要此电子邮件: 情景2:感谢您对我们的产品XXX感兴趣。如前所述,我方将于XXX向贵方位于XXX的办公室派遣我方代表 此外

我在stackoverflow上看到了几个与XML、XSLT和HTML相关的问题,但我觉得我的问题有点不同。以下是我需要的:

我需要给我的客户发一封电子邮件。电子邮件的措辞可能因场景而异。每个场景都有相应的格式保存在数据库中。例如,一个场景可能需要此电子邮件:

场景1:我们已经为您的XXX电话开通了票证XXX/参考号XXX。请致电XXX与我们联系,以跟踪进度

另一种情况可能需要此电子邮件:

情景2:感谢您对我们的产品XXX感兴趣。如前所述,我方将于XXX向贵方位于XXX的办公室派遣我方代表

此外,格式可能需要根据数据可用性进行一些更改。e、 g.如果我需要发送场景1对应的电子邮件,而我没有可用的参考号,我希望在运行中(不在数据库中)完全删除参考号部分,即,我希望这样:

场景3:我们已经为您的XXX电话开通了XXX号机票。请致电XXX与我们联系,以跟踪进度

场景1和场景2的格式作为XSLT存储在数据库中,对应于上面看到的字符串。场景3的格式必须动态生成。必须用实际数据替换XXX零件。这些数据在我拥有的XML可序列化对象中可用

我想序列化这个对象,在内存中生成一个XML,修改XSLT以反映我拥有的数据,在场景中使用XSLT将内存中的XML转换为HTML,然后将HTML作为字符串参数传递给我拥有的电子邮件方法。电子邮件部分工作正常。我需要使用适当的XSLT处理对象->内存中的XML->轻微的XSLT修改->HTML

如果您能提供代码示例,而不仅仅是我需要遵循的方法,我将不胜感激

编辑:

以下是工作代码:

using (xsltStream = new MemoryStream(emailInfo.Body))
            {
                // Create an XmlReader from the Stream
                XmlReader reader = XmlReader.Create(xsltStream);

                // Create and load the transform with document function enabled.
                XslCompiledTransform transform = new XslCompiledTransform();
                XsltSettings settings = new XsltSettings();
                settings.EnableDocumentFunction = true;
                transform.Load(reader, settings, null);

                // Execute the transformation.
                transform.Transform(doc, writer);
             }
场景1和场景2的格式作为XSLT存储在数据库中

我认为我更倾向于将格式存储为XML,而不是XSLT:

<message>Thanks for your interest in our Product <product/>. As discussed we will send our representative on <date/> to your office located at <officeLocation/>.</message>
感谢您对我们的产品感兴趣。如前所述,我们将派代表前往贵公司位于的办事处。
然后使用标准样式表转换此文档,使用来自另一个文档的数据

说到这里,我之所以推荐这一点,是因为我是按照您描述的方式自己做的,并且很遗憾,因为进行更改或引入新的变体太困难了

场景1和场景2的格式作为XSLT存储在数据库中

我认为我更倾向于将格式存储为XML,而不是XSLT:

<message>Thanks for your interest in our Product <product/>. As discussed we will send our representative on <date/> to your office located at <officeLocation/>.</message>
感谢您对我们的产品感兴趣。如前所述,我们将派代表前往贵公司位于的办事处。
然后使用标准样式表转换此文档,使用来自另一个文档的数据


说到这里,我之所以推荐这一点,是因为我是按照您描述的方式自己做的,对此我感到遗憾,因为进行更改或引入新的变体太难了。

根据@harpo、@Alexei Levenkov和@Alejandro的评论,我能够制定出一个使用多个模板的代码工作版本。因为我不能将评论标记为答案,所以我会将其标记为答案,并在问题中添加代码

using (xsltStream = new MemoryStream(emailInfo.Body))
            {
                // Create an XmlReader from the Stream
                XmlReader reader = XmlReader.Create(xsltStream);

                // Create and load the transform with document function enabled.
                XslCompiledTransform transform = new XslCompiledTransform();
                XsltSettings settings = new XsltSettings();
                settings.EnableDocumentFunction = true;
                transform.Load(reader, settings, null);

                // Execute the transformation.
                transform.Transform(doc, writer);
             }

根据@harpo、@Alexei-Levenkov和@Alejandro的评论,我能够开发出一个使用多个模板的代码工作版本。因为我不能将评论标记为答案,所以我会将其标记为答案,并在问题中添加代码

using (xsltStream = new MemoryStream(emailInfo.Body))
            {
                // Create an XmlReader from the Stream
                XmlReader reader = XmlReader.Create(xsltStream);

                // Create and load the transform with document function enabled.
                XslCompiledTransform transform = new XslCompiledTransform();
                XsltSettings settings = new XsltSettings();
                settings.EnableDocumentFunction = true;
                transform.Load(reader, settings, null);

                // Execute the transformation.
                transform.Transform(doc, writer);
             }

XSLT支持参数,这些参数可以从客户机代码中传递。您可能可以避免您提到的“动态”修改(听起来像是一种黑客行为)?无需对XSLT进行任何修改…完全相同。唯一的新要求是使用多个布局:在选择布局之前根据一些断言选择布局。谢谢@harpo。我知道可以填充数据值的参数。但是,我需要在这里更改模板本身,而不仅仅是数据值。如果可以通过参数实现,我将不胜感激。谢谢@Alexei。我并不完全反对使用不同的模板。然而,我避免这样做,因为在我的实际应用程序中,电子邮件不会是一行。它们更大,而且有很多数据,在我发送电子邮件时可能无法获取。如果每个排列组合都有一个模板,那么最终可能会有10-20个模板,用于我需要发送的3种电子邮件。XSLT支持参数,这些参数可以从客户端代码传递。您可能可以避免您提到的“动态”修改(听起来像是一种黑客行为)?无需对XSLT进行任何修改…完全相同。唯一的新要求是使用多个布局:在选择布局之前根据一些断言选择布局。谢谢@harpo。我知道可以填充数据值的参数。但是,我需要在这里更改模板本身,而不仅仅是数据值。如果可以通过参数实现,我将不胜感激。谢谢@Alexei。我并不完全反对使用不同的模板。然而,我避免这样做,因为在我的实际应用程序中,电子邮件不会是一行。它们更大,而且有很多数据,在我发送电子邮件时可能无法获取。如果每个排列组合都有一个模板,我可能最终会得到10-20个模板,用于我需要发送的3种电子邮件。谢谢Micheal。你能用一些代码来说明这个方法吗?谢谢Micheal。你能用一些代码来说明这个方法吗。