Как перейти с 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())

person Atara    schedule 14.03.2010    source источник


Ответы (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
person John Saunders    schedule 14.03.2010
comment
Спасибо. и как мне использовать XmlDocument в любой перегрузке xslt.Load()? - person Atara; 14.03.2010
comment
Спасибо, мне потребуется несколько дней, чтобы убедиться, что он работает должным образом. (Мне нужно перенести большой проект, а пока я стараюсь избегать ошибок компиляции :( ) - person Atara; 15.03.2010