Как перейти с XslTransform на XslCompiledTransform - PullRequest
5 голосов
/ 14 марта 2010

У меня есть следующий код, который мне нужно перенести с VS 2003 (.Net 1.1) на VS 2008 (.Net 2+) но я получаю ошибку компиляции -

System.Xml.Xsl.XslTransform 'устарел: этот класс устарел. Мне, вероятно, нужно использовать System.Xml.Xsl.XslCompiledTransform вместо этого. но я не нахожу подходящие версии перегрузки Load () и Transform (), которые я могу использовать со всеми параметрами моего исходного кода.

в MSDN [Как: перенести код XslTransform] Я нашел только несколько простых случаев. http://msdn.microsoft.com/en-us/library/aa983475%28VS.80%29.aspx но в моем коде я вижу некоторые замечания, которые намекают на то, что добавленные параметры использовались, чтобы избежать исключений, поэтому я предпочитаю использовать эти параметры.

Может кто-нибудь помочь с переносом этого кода?

Спасибо, Атар

' ----------------------------------------------------------------------   
' VS 2003 code:
' ----------------------------------------------------------------------

. . .

Dim myXslDoc As Xml.XmlDocument

' ----------------------------------------------------------------------   
  Public Sub mcSetParameters(ByVal srcFileName As String)
' ----------------------------------------------------------------------

 Me.myXslDoc = New Xml.XmlDocument 
 Me.myXslDoc.Load(srcFileName) 

End Sub


' ----------------------------------------------------------------------    
  Public Sub mcSetHtml()
' ----------------------------------------------------------------------

 Dim oXPathNav As System.Xml.XPath.XPathNavigator = xmlDoc.DocumentElement.CreateNavigator()

 Dim sbContent As New System.Text.StringBuilder
 Dim swContent As New System.IO.StringWriter(sbContent)        

 Dim args As New System.Xml.Xsl.XsltArgumentList
 args.AddParam("paramName1", "", paramVal1.ToString)
 args.AddParam("paramName2", "", paramVal2.ToString)

 Try
   ' Try to avoid "Invalid site" exception, by using XmlUrlResolver and Evidence.
   ' If the XSLT stylesheet . . . comes from a code base that you trust, Then use Me.GetType().Assembly.Evidence() 
   Dim resolver As System.Xml.XmlUrlResolver = New System.Xml.XmlUrlResolver
   resolver.Credentials = System.Net.CredentialCache.DefaultCredentials
   Dim xslt As System.Xml.Xsl.XslTransform = New System.Xml.Xsl.XslTransform 
   xslt.Load(Me.myXslDoc, resolver, Me.GetType().Assembly.Evidence())        
   xslt.Transform(oXPathNav, args, swContent, Nothing)                       
 Catch ex As Exception
   Debug.WriteLine("Exception: {0}", ex.ToString())
 End Try

 DoSomething(sbContent.ToString())

End Sub

' ----------------------------------------------------------------------

в моем старом коде у меня есть и xmlDoc, и xslDoc, поэтому скомпилированный код, который у меня сейчас (еще не проверен):

'---------------------------------------------- ------------------------
Пробный код VS 2008:

'---------------------------------------------- ------------------------

  Dim sbContent As System.Text.StringBuilder = New System.Text.StringBuilder()
  Dim swContent As System.IO.StringWriter = New System.IO.StringWriter(sbContent)
  Dim contentWriter As System.Xml.XmlWriter = System.Xml.XmlWriter.Create(swContent)

  Dim args As New System.Xml.Xsl.XsltArgumentList()
  args.AddParam("paramName1", "", paramVal1.ToString)
  args.AddParam("paramName2", "", paramVal2.ToString)

  Try
    Dim resolver As New System.Xml.XmlUrlResolver
    resolver.Credentials = System.Net.CredentialCache.DefaultCredentials

    Dim evidence As System.Security.Policy.Evidence = Me.GetType().Assembly.Evidence
    Dim secureResolver As New System.Xml.XmlSecureResolver(resolver, evidence)
    Dim settings As New System.Xml.Xsl.XsltSettings(False, True)

    Dim xslt As New System.Xml.Xsl.XslCompiledTransform()  
    xslt.Load(Me.myXslDoc, settings, secureResolver)    
    xslt.Transform(xmlDoc, args, contentWriter)  
  Catch ex As Exception
    Debug.WriteLine("Exception: {0}", ex.ToString())
  End Try

  DoSomething(sbContent.ToString())

1 Ответ

2 голосов
/ 14 марта 2010

Эти дополнительные параметры больше не предоставляются классом XsltCompiledTransform напрямую. Теперь вы можете загрузить преобразование, используя любой XmlReader, который вам нравится.

Если вам нужна дополнительная защита, создайте XmlReader, который использует XmlSecureResolver:

Private MyXslDoc As String = "XslFilePath"
Public Sub LoadTransform(ByVal paramVal1 As Object, ByVal paramVal2 As Object)
    Dim args As New System.Xml.Xsl.XsltArgumentList
    args.AddParam("paramName1", "", paramVal1.ToString)
    args.AddParam("paramName2", "", paramVal2.ToString)

    Dim resolver As New System.Xml.XmlUrlResolver
    resolver.Credentials = System.Net.CredentialCache.DefaultCredentials
    Dim evidence As Evidence = Me.GetType().Assembly.Evidence
    Dim secureResolver As New XmlSecureResolver(resolver, evidence)
    Dim settings As New XmlReaderSettings
    settings.XmlResolver = secureResolver

    Dim xslt As New System.Xml.Xsl.XslCompiledTransform()
    Using transformReader As XmlReader = XmlReader.Create(Me.MyXslDoc, settings)
        xslt.Load(transformReader)
    End Using

    Using documentReader As XmlReader = XmlReader.Create(documentUri)
        Dim sbContent As New System.Text.StringBuilder
        Using swContent As New System.IO.StringWriter(sbContent)

            Using contentWriter As XmlWriter = XmlWriter.Create(swContent)
                xslt.Transform(documentReader, args, contentWriter, Nothing)
            End Using
        End Using
    End Using
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...