在.net xslt,XslCompiledTransform和序列化对象时查找XPath

时间:2014-01-22 13:41:50

标签: .net vb.net xslt xpath

我正在尝试使用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。

编辑:删除了一些转换为//

的评论

1 个答案:

答案 0 :(得分:0)

通过删除XML文档中名称空间的创建,我能够使Xslt电子邮件模板正常工作。

在Email.aspx.vb中,我更改了

Dim serializer As New XmlSerializer(client.GetType, "UserProfile")

Dim serializer As New XmlSerializer(client.GetType)

在这种情况下不需要添加默认命名空间,因此我只是删除了该参数。

如果有人可以使用默认命名空间来使用它,我会将您的答案标记为正确。感谢