Substituer la référence a un document dans un XSLT

Jayme65 Messages postés 60 Date d'inscription lundi 23 avril 2007 Statut Membre Dernière intervention 26 mars 2019 - 15 déc. 2016 à 18:10
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 - 18 déc. 2016 à 08:11
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
--

1 réponse

Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
18 déc. 2016 à 08:11
Bonjour

Est-ce vraiment nécessaire que le fichier xml soit mis en ressource?
Ne peux tu pas le placer dans un sous répertoire (temporaire?) de ton application le temps de faire ton traitement et éventuellement le supprimer à la fin?
0
Rejoignez-nous