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

Jayme65 64 Messages postés lundi 23 avril 2007Date d'inscription 15 décembre 2016 Dernière intervention - 15 déc. 2016 à 18:10 - Dernière réponse : Whismeril 10552 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 14 décembre 2017 Dernière intervention
- 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
--
Afficher la suite 

1 réponse

Répondre au sujet
Whismeril 10552 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 14 décembre 2017 Dernière intervention - 18 déc. 2016 à 08:11
0
Utile
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?
Commenter la réponse de Whismeril

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.