RE: [xsl] Saxon Process is not releasing my output file

Subject: RE: [xsl] Saxon Process is not releasing my output file
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Mon, 11 Dec 2006 17:23:22 -0000
The best place to report product-specific problems is on the appropriate
list for that product; in the case of Saxon, that's the saxon-help mailing
list or forum on the SourceForge.net site.

You're right, when you use the DocumentBuilder.Build(Uri) method in the .NET
API, it fails to close the input stream obtained from the Uri. Workaround:
change your call Build(Uri) to use:

            DocumentBuilder.BaseUri = uri;
            Stream inn = (Stream)DocumentBuilder.XmlResolver.GetEntity(
                         uri, "application/xml",
Type.GetType("System.IO.Stream")
            XdmNode input = Build(inn);
            inn.Close(); 

Pardon my lack of VB.NET syntax.

Michael Kay
http://www.saxonica.com/



> -----Original Message-----
> From: Spencer Tickner [mailto:spencertickner@xxxxxxxxx] 
> Sent: 10 December 2006 17:33
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] Saxon Process is not releasing my output file
> 
> Hi List,
> 
> Hope this is an "in Scope" question. I'm using Saxon to run a 
> process in .net. The basic scenario is my xslt takes an XML 
> called new, compares it to an XML document called old. Then 
> the "new" XML document is copied over "old".
> 
> The problem is when the copy happens I get the dreaded "The 
> process cannot access the file 'L:\file_path\old.xml' because 
> it is being used by another process".
> 
> The call:
> 
> Dim x As New Saxon
> x.Transform(strDir & "my.xsl", strDir & "new.xml", strRepository &
> "difference.xml")
> x = Nothing
> 
> ' Error occurs here
> File.Copy(strDir & "Stat.xml", strDir & "stat_old.xml", True)
> 
> 
> The Transform: (probably more Nothing/Flush/Close commands 
> then I need but I wanted to make sure everything was taken care of):
> 
>        Public Sub Transform(ByVal xslDoc As String, ByVal 
> xmlDoc As String, _
>             ByVal output As String)
> 
> 
>             Dim u As Uri
>             'Create a New Processor instance
>             Dim processor As New Processor
>             'Load the source document
>             u = New Uri(xmlDoc)
>             Dim input As XdmNode = 
> processor.NewDocumentBuilder.Build(u)
>             'Create the transformer for the stylesheet
>             Dim transformer As XsltTransformer
> 
>             Try
>                 u = New Uri(xslDoc)
> 
>                 transformer = _
>                     processor.NewXsltCompiler().Compile(u).Load()
>             Catch ex As Exception
>                 u = Nothing
>                 MsgBox("Exception" & ex.ToString)
>                 MsgBox(ex.StackTrace)
>                 Throw New Exception(ex.Message)
>             End Try
> 
>             'Set the root node of the source document to be 
> the initial context node
>             transformer.InitialContextNode = input
> 
>             'Create the serializer
>             Dim serializer As New Serializer
>             Dim fi As FileStream
>             Try
>                 fi = New FileStream(output, FileMode.Create, 
> FileAccess.Write)
>                 serializer.SetOutputStream(fi)
>                 'Transform the source XML
>                 transformer.Run(serializer)
>                 'fi.Flush()
>                 'fi.Dispose()
>                 fi.Close()
>             Catch ex As Exception
>                 Throw New Exception(ex.Message)
>             Finally
>                 u = Nothing
>                 serializer = Nothing
>                 transformer = Nothing
>                 processor = Nothing
>                 input = Nothing
>                 fi = Nothing
>             End Try
> 
>         End Sub
> 
> Thanks for any help..
> 
> Spencer

Current Thread