none
Substituer la référence a un document dans un XSLT RRS feed

  • Discussion générale

  • Bonjour,
    Je reçois des fichiers XSLT (auquel je ne peux pas toucher) pour transformer des fichiers XML
    Les fichiers XSLT sont en ressource de l'application et les fichiers XML à transformer sont sur le PC de l'utilisateur.

    Jusqu'à là, pas de soucis ;)

    Mais voila que je reçois des fichiers XSLT avec une référence à un fichier XML à l'intérieur!
    Ces 2 fichiers devront être en resource.
    Comment puis-je faire pour charger le XSLT en resource (ça pas de problème) et aussi "substituer" la référence au document XML à un document XML en ressource?

    Dans le fichier XSLT, voici la référence au fichier XML:

    <xsl:param name="ExternalDoc2" select="'C:\Users\jmd_000\Desktop\ExternalDoc.xml'"/>

    ...et en effet, tant que l'on reste avec le fichier présent en local tout fonctionne bien.

    Ce que j'essaie donc, je vous le rappelle, c'est de pouvoir substituer ce fichier local à un fichier en resource (tout comme l'est déjà le fichier XLST)

    D'avance un tout grand merci pour votre aide!

    Imports System.IO
    Imports System.Reflection
    Imports System.Xml
    Imports System.Xml.XPath
    Imports System.Xml.Xsl
    
    Class MainWindow
        Private Sub MainWindow_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles Me.Loaded
            ToUpdate()
        End Sub
        Sub ToUpdate()
            TransformXML("..\..\..\OldData.xml", "MappingMapToNewData.xslt", "..\..\..\NewData.xml")
        End Sub
        Public Shared Sub TransformXML(sXmlPath As String, sXslPath As String, outPath As String)
            Try
                ' loading XML 
                Dim myXPathDoc As New XPathDocument(sXmlPath)
                Dim myXslTrans As New XslCompiledTransform()
    
                ' loading XSLT from embedded resource
                Using strm As Stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("WpfApplication1." & sXslPath)
                    Using reader As XmlReader = XmlReader.Create(strm)
                        Dim resolver = New MyXmlUrlResolver()
                        myXslTrans.Load(reader, XsltSettings.TrustedXslt, resolver)
                    End Using
                End Using
    
                ' creating Output Stream 
                Dim myWriter As New XmlTextWriter(outPath, Nothing)
                myWriter.Formatting = Formatting.Indented
    
                ' XML transformation 
                myXslTrans.Transform(myXPathDoc, Nothing, myWriter)
                myWriter.Close()
            Catch e As Exception
                '
            End Try
        End Sub
    
        Private Class MyXmlUrlResolver
            Inherits XmlUrlResolver
            Public Overrides Function GetEntity(absoluteUri As Uri, role As String, ofObjectToReturn As Type) As Object
                Select Case absoluteUri.Scheme
                    Case "file"
                        Dim origString As String = absoluteUri.OriginalString
                        Dim assembly__1 As Assembly = Assembly.GetExecutingAssembly()
                        Dim resourceName As String = "WpfApplication1.ExternalDoc.xml"
    
                        Dim stream = assembly__1.GetManifestResourceStream(resourceName)
                        Return stream
                    Case Else
                        Return DirectCast(MyBase.GetEntity(absoluteUri, role, ofObjectToReturn), Stream)
                End Select
            End Function
        End Class
    End Class
    Voici un lien vers la solution pour vous faciliter la vie ;)

    http://www100.zippyshare.com/v/lP7dNE2z/file.html

    jeudi 15 décembre 2016 17:06

Toutes les réponses

  • Bonjour,
    Pour ajouter un fichier resource, allez sur VS project > clique droit > Properties > Resources > Add Resource. Pour lancer le fichier XML qui se trouve dans les resources, essayez: Loading internal text file as XML.

    Cordialement,
    Nina

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    vendredi 16 décembre 2016 15:40
    Modérateur
  • Merci de l'effort...mais ce n'est absolument pas ce qui est demandé! ;)

    Les fichiers sont en resource, un chargement et une transformation au premier degré fonctionne!

    On parle ici du téléchargement et de la transformation au deuxième degré (un fichier XML référencé dans le fichier XSLT et disponible lui aussi en resource)


    • Modifié jmdeb vendredi 16 décembre 2016 16:35
    vendredi 16 décembre 2016 16:34