我正在尝试使用xslt创建一个电子邮件模板,并使用xml(序列化对象)和.net的XslCompiledTransform填充数据以处理转换。
我正在使用.NET 2.0和Visual Studio 2012.为了获得原型,我创建了一个简单的项目,其中包含一个页面,该页面输出转换结果以用于测试目的。
使用当前代码,我似乎无法找到序列化对象元素的正确XPath。
创建一个名为UserProfile的类:
<Serializable>
Public Class UserProfile
Public Property FirstName As String
Public Property LastName As String
Public Sub New()
End Sub
End Class
创建一个名为Templates的文件夹,在其中创建一个xslt文件“TestEmail.xslt”
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
First Name is <xsl:value-of select="UserProfile/FirstName"/><br/>
Last Name is <xsl:value-of select="UserProfile/LastName"/>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
创建名为Email.aspx的Web窗体文件
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Email.aspx.vb" Inherits="Email.Email" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Literal ID="output" runat="server"></asp:Literal>
</div>
</form>
</body>
</html>
在Email.aspx.vb文件中:
Imports System.Xml
Imports System.Xml.XPath
Imports System.Xml.Xsl
Imports System.IO
Imports System.Xml.Serialization
Public Class Email
Inherits System.Web.UI.Page
Dim client As UserProfile
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
client = New UserProfile
client.FirstName = "First"
client.LastName = "Last"
output.Text = BuildEmail()
End Sub
Private Function BuildEmail()
Dim email As String = ""
Dim document As XmlDocument
Dim navigator As XPathNavigator
Dim transformer As XslCompiledTransform
Dim output As StringWriter
Dim serializationStream As New MemoryStream()
Dim serializer As New XmlSerializer(client.GetType, "UserProfile")
Try
serializer.Serialize(serializationStream, client)
serializationStream.Position = 0
document = New XmlDocument()
Dim reader As XmlReader = XmlReader.Create(serializationStream)
document.Load(reader)
// create navigator
navigator = document.CreateNavigator
// load style sheet
transformer = New XslCompiledTransform(True)
Dim templatePath = Server.MapPath("Templates/TestEmail.xslt")
transformer.Load(templatePath)
// transform XML data
output = New StringWriter()
transformer.Transform(navigator, Nothing, output)
email = output.ToString
// close streams
output.Close()
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
Return email
End Function
End Class
这应该是足够的代码来重现没有找到元素的XPath的问题。
编辑:更改的姓氏是姓氏,位于xslt doc。
编辑:删除了一些转换为//
的评论答案 0 :(得分:0)
通过删除XML文档中名称空间的创建,我能够使Xslt电子邮件模板正常工作。
在Email.aspx.vb中,我更改了
Dim serializer As New XmlSerializer(client.GetType, "UserProfile")
到
Dim serializer As New XmlSerializer(client.GetType)
在这种情况下不需要添加默认命名空间,因此我只是删除了该参数。
如果有人可以使用默认命名空间来使用它,我会将您的答案标记为正确。感谢