Substituer la référence a un document dans un XSLT
Jayme65
Messages postés60Date d'inscriptionlundi 23 avril 2007StatutMembreDernière intervention26 mars 2019
-
15 déc. 2016 à 18:10
Whismeril
Messages postés19025Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention19 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:
...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
Whismeril
Messages postés19025Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention19 avril 2024656 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?