Как перейти с XslTransform на XslCompiledTransform

У меня есть следующий код, который мне нужно перенести с 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 ответ

Эти дополнительные параметры больше не отображаются непосредственно 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
Другие вопросы по тегам