Hi,
I have a problem parsing XML file using XSLT stylesheet by using :
using System.Xml;
using System.Xml.XPath;
using System.Xml.Xsl;
// load Xsl stylesheet
XslTransform myXslTrans = new XslTransform() ;
myXslTrans.Load(Server.MapPath("stylesheet.xslt")) ;
// load the Xml doc
XPathDocument myXPathDoc = new XPathDocument(Server.MapPath("file.xml"));
// write the transformed result
XmlTextWriter writer = new XmlTextWriter(Server.MapPath("result.xml"), null);
// do the actual transform of Xml
// pass XmlResolver to Transform() method
myXslTrans.Transform(myXPathDoc, null, writer, null);
writer.Close();
XML file
<?xml version="1.0" encoding="utf-8"?>
<Documents>
<Document chapter="1" title="title 1" href="file1.xml" filter="">
<Article title="1.1" info="sub" filter="food"/>
<Article title="1.2" info="main" filter="food"/>
</Document>
<Document chapter="2" title="title 2" href="file2.xml" filter="drink">
<Article title="2.1" info="sub" filter="drink"/>
<Article title="2.2" info="main" filter="food"/>
</Document>
</Documents>
XSLT stylesheet
<?xml version='1.0' encoding='UTF-8'?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- using muenchian method group by an attribute by asigning a unique
key to each element -->
<xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
<!-- xsl:key name="by-proctype" match="Doc" use="@proceduretype"/ -->
<!-- define info key -->
<xsl:key name="by-info" match="Article" use="@info"/>
<!-- put the filter string in a global parameter -->
<xsl:param name="filter" select="'food'"/>
<xsl:template match="Documents"><!-- @filter='' will be true if it is
there and empty or if it is not there at all) -->
<documents>
<xsl:for-each select="Document[@filter='' or
@filter=$filter]/Article[count(.|key('by-info',@info)[@filter='' or
@filter=$filter][1])=1]">
<document name="{@info}"><xsl:copy-of
select="key('by-info',@info)[@filter=$filter]"/></document>
</xsl:for-each>
</documents>
</xsl:template>
</xsl:stylesheet>
Exception Details:
System.NullReferenceException: Object reference not set to an instance of an
object."
Stack Trace:
[NullReferenceException: Object reference not set to an instance of an
object.]
System.Xml.XPath.FilterQuery.SetXsltContext(XsltCo ntext input)
System.Xml.XPath.FilterQuery.SetXsltContext(XsltCo ntext input)
System.Xml.XPath.MergeFilterQuery.SetXsltContext(X sltContext input)
System.Xml.XPath.OrQuery.SetXsltContext(XsltContex t context)
System.Xml.XPath.MethodOperand.SetXsltContext(Xslt Context context)
System.Xml.XPath.LogicalExpr.SetXsltContext(XsltCo ntext context)
System.Xml.XPath.FilterQuery.SetXsltContext(XsltCo ntext input)
System.Xml.XPath.MergeFilterQuery.SetXsltContext(X sltContext input)
System.Xml.XPath.CompiledXpathExpr.SetContext(XmlN amespaceManager
nsManager)
System.Xml.Xsl.Processor.GetCompiledQuery(Int32 key)
System.Xml.Xsl.Processor.StartQuery(XPathNavigator context, Int32 key)
System.Xml.Xsl.ForEachAction.Execute(Processor processor, ActionFrame
frame)
System.Xml.Xsl.ActionFrame.Execute(Processor processor)
System.Xml.Xsl.Processor.Execute()
System.Xml.Xsl.XslTransform.Transform(XPathNavigat or input,
XsltArgumentList args, XmlWriter output, XmlResolver resolver)
System.Xml.Xsl.XslTransform.Transform(IXPathNaviga ble input,
XsltArgumentList args, XmlWriter output, XmlResolver resolver)
com.pop.mm_main_v2.Page_Load(Object sender, EventArgs e) in
c:\inetpub\wwwroot\file\index.aspx.cs:61
......
When I use XMLSpy to parse the XML using MSXML 4 processor it works perfect.
Saxon works perfectly as well. But when I try to parse it trough C#, I get
the error above.
It looks like I don't use MSXML 4 at all.
How do I make sure that MSXML 4 is used when I parse?
Thank you,
-Mike 7 3325
I have figured out that this is a parser issue.
My IE is using version 3.0 set as default in registry. http://www.perfectxml.com/articles/xml/XSLTInMSXML.asp
There must be a way to set this in a namespace so, IE does understand what
processor to use.
/Michael
"Michael" wrote: Hi,
I have a problem parsing XML file using XSLT stylesheet by using :
using System.Xml; using System.Xml.XPath; using System.Xml.Xsl;
// load Xsl stylesheet XslTransform myXslTrans = new XslTransform() ; myXslTrans.Load(Server.MapPath("stylesheet.xslt")) ;
// load the Xml doc XPathDocument myXPathDoc = new XPathDocument(Server.MapPath("file.xml"));
// write the transformed result XmlTextWriter writer = new XmlTextWriter(Server.MapPath("result.xml"), null);
// do the actual transform of Xml // pass XmlResolver to Transform() method myXslTrans.Transform(myXPathDoc, null, writer, null); writer.Close();
XML file
<?xml version="1.0" encoding="utf-8"?>
<Documents> <Document chapter="1" title="title 1" href="file1.xml" filter=""> <Article title="1.1" info="sub" filter="food"/> <Article title="1.2" info="main" filter="food"/> </Document> <Document chapter="2" title="title 2" href="file2.xml" filter="drink"> <Article title="2.1" info="sub" filter="drink"/> <Article title="2.2" info="main" filter="food"/> </Document> </Documents>
XSLT stylesheet
<?xml version='1.0' encoding='UTF-8'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- using muenchian method group by an attribute by asigning a unique key to each element -->
<xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
<!-- xsl:key name="by-proctype" match="Doc" use="@proceduretype"/ -->
<!-- define info key --> <xsl:key name="by-info" match="Article" use="@info"/>
<!-- put the filter string in a global parameter --> <xsl:param name="filter" select="'food'"/>
<xsl:template match="Documents"><!-- @filter='' will be true if it is there and empty or if it is not there at all) -->
<documents> <xsl:for-each select="Document[@filter='' or @filter=$filter]/Article[count(.|key('by-info',@info)[@filter='' or @filter=$filter][1])=1]"> <document name="{@info}"><xsl:copy-of select="key('by-info',@info)[@filter=$filter]"/></document> </xsl:for-each> </documents> </xsl:template>
</xsl:stylesheet>
Exception Details:
System.NullReferenceException: Object reference not set to an instance of an object."
Stack Trace:
[NullReferenceException: Object reference not set to an instance of an object.] System.Xml.XPath.FilterQuery.SetXsltContext(XsltCo ntext input) System.Xml.XPath.FilterQuery.SetXsltContext(XsltCo ntext input) System.Xml.XPath.MergeFilterQuery.SetXsltContext(X sltContext input) System.Xml.XPath.OrQuery.SetXsltContext(XsltContex t context) System.Xml.XPath.MethodOperand.SetXsltContext(Xslt Context context) System.Xml.XPath.LogicalExpr.SetXsltContext(XsltCo ntext context) System.Xml.XPath.FilterQuery.SetXsltContext(XsltCo ntext input) System.Xml.XPath.MergeFilterQuery.SetXsltContext(X sltContext input) System.Xml.XPath.CompiledXpathExpr.SetContext(XmlN amespaceManager nsManager) System.Xml.Xsl.Processor.GetCompiledQuery(Int32 key) System.Xml.Xsl.Processor.StartQuery(XPathNavigator context, Int32 key) System.Xml.Xsl.ForEachAction.Execute(Processor processor, ActionFrame frame) System.Xml.Xsl.ActionFrame.Execute(Processor processor) System.Xml.Xsl.Processor.Execute() System.Xml.Xsl.XslTransform.Transform(XPathNavigat or input, XsltArgumentList args, XmlWriter output, XmlResolver resolver) System.Xml.Xsl.XslTransform.Transform(IXPathNaviga ble input, XsltArgumentList args, XmlWriter output, XmlResolver resolver) com.pop.mm_main_v2.Page_Load(Object sender, EventArgs e) in c:\inetpub\wwwroot\file\index.aspx.cs:61 .....
When I use XMLSpy to parse the XML using MSXML 4 processor it works perfect. Saxon works perfectly as well. But when I try to parse it trough C#, I get the error above.
It looks like I don't use MSXML 4 at all.
How do I make sure that MSXML 4 is used when I parse? Thank you,
-Mike
As a workaround I used generate-id() function in Muenchian method instead of
count():
Something with numeric predicate I think.
<xsl:for-each select="Document[@filter='' or
@filter=$filter]/Article[generate-id()=generate-id(key('by-info',@info)[@filter='' or @filter=$filter])]">
Now it works as it should.
--Michael
"Michael" wrote: I have figured out that this is a parser issue. My IE is using version 3.0 set as default in registry.
http://www.perfectxml.com/articles/xml/XSLTInMSXML.asp
There must be a way to set this in a namespace so, IE does understand what processor to use.
/Michael
"Michael" wrote:
Hi,
I have a problem parsing XML file using XSLT stylesheet by using :
using System.Xml; using System.Xml.XPath; using System.Xml.Xsl;
// load Xsl stylesheet XslTransform myXslTrans = new XslTransform() ; myXslTrans.Load(Server.MapPath("stylesheet.xslt")) ;
// load the Xml doc XPathDocument myXPathDoc = new XPathDocument(Server.MapPath("file.xml"));
// write the transformed result XmlTextWriter writer = new XmlTextWriter(Server.MapPath("result.xml"), null);
// do the actual transform of Xml // pass XmlResolver to Transform() method myXslTrans.Transform(myXPathDoc, null, writer, null); writer.Close();
XML file
<?xml version="1.0" encoding="utf-8"?>
<Documents> <Document chapter="1" title="title 1" href="file1.xml" filter=""> <Article title="1.1" info="sub" filter="food"/> <Article title="1.2" info="main" filter="food"/> </Document> <Document chapter="2" title="title 2" href="file2.xml" filter="drink"> <Article title="2.1" info="sub" filter="drink"/> <Article title="2.2" info="main" filter="food"/> </Document> </Documents>
XSLT stylesheet
<?xml version='1.0' encoding='UTF-8'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- using muenchian method group by an attribute by asigning a unique key to each element -->
<xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
<!-- xsl:key name="by-proctype" match="Doc" use="@proceduretype"/ -->
<!-- define info key --> <xsl:key name="by-info" match="Article" use="@info"/>
<!-- put the filter string in a global parameter --> <xsl:param name="filter" select="'food'"/>
<xsl:template match="Documents"><!-- @filter='' will be true if it is there and empty or if it is not there at all) -->
<documents> <xsl:for-each select="Document[@filter='' or @filter=$filter]/Article[count(.|key('by-info',@info)[@filter='' or @filter=$filter][1])=1]"> <document name="{@info}"><xsl:copy-of select="key('by-info',@info)[@filter=$filter]"/></document> </xsl:for-each> </documents> </xsl:template>
</xsl:stylesheet>
Exception Details:
System.NullReferenceException: Object reference not set to an instance of an object."
Stack Trace:
[NullReferenceException: Object reference not set to an instance of an object.] System.Xml.XPath.FilterQuery.SetXsltContext(XsltCo ntext input) System.Xml.XPath.FilterQuery.SetXsltContext(XsltCo ntext input) System.Xml.XPath.MergeFilterQuery.SetXsltContext(X sltContext input) System.Xml.XPath.OrQuery.SetXsltContext(XsltContex t context) System.Xml.XPath.MethodOperand.SetXsltContext(Xslt Context context) System.Xml.XPath.LogicalExpr.SetXsltContext(XsltCo ntext context) System.Xml.XPath.FilterQuery.SetXsltContext(XsltCo ntext input) System.Xml.XPath.MergeFilterQuery.SetXsltContext(X sltContext input) System.Xml.XPath.CompiledXpathExpr.SetContext(XmlN amespaceManager nsManager) System.Xml.Xsl.Processor.GetCompiledQuery(Int32 key) System.Xml.Xsl.Processor.StartQuery(XPathNavigator context, Int32 key) System.Xml.Xsl.ForEachAction.Execute(Processor processor, ActionFrame frame) System.Xml.Xsl.ActionFrame.Execute(Processor processor) System.Xml.Xsl.Processor.Execute() System.Xml.Xsl.XslTransform.Transform(XPathNavigat or input, XsltArgumentList args, XmlWriter output, XmlResolver resolver) System.Xml.Xsl.XslTransform.Transform(IXPathNaviga ble input, XsltArgumentList args, XmlWriter output, XmlResolver resolver) com.pop.mm_main_v2.Page_Load(Object sender, EventArgs e) in c:\inetpub\wwwroot\file\index.aspx.cs:61 .....
When I use XMLSpy to parse the XML using MSXML 4 processor it works perfect. Saxon works perfectly as well. But when I try to parse it trough C#, I get the error above.
It looks like I don't use MSXML 4 at all.
How do I make sure that MSXML 4 is used when I parse? Thank you,
-Mike
Hello,
This looks like a Bug! How can this be reported to Microsoft to appropriate
developer team?
Something with numeric predicate I think.
As a workaround you can use generate-id() function in Muenchian method
instead of count():
<xsl:for-each select="Document[@filter='' or
@filter=$filter]/Article[generate-id()=generate-id(key('by-info',@info)[@filter='' or @filter=$filter])]">
-Michael
"Michael" wrote: I have figured out that this is a parser issue. My IE is using version 3.0 set as default in registry.
http://www.perfectxml.com/articles/xml/XSLTInMSXML.asp
There must be a way to set this in a namespace so, IE does understand what processor to use.
/Michael
"Michael" wrote:
Hi,
I have a problem parsing XML file using XSLT stylesheet by using :
using System.Xml; using System.Xml.XPath; using System.Xml.Xsl;
// load Xsl stylesheet XslTransform myXslTrans = new XslTransform() ; myXslTrans.Load(Server.MapPath("stylesheet.xslt")) ;
// load the Xml doc XPathDocument myXPathDoc = new XPathDocument(Server.MapPath("file.xml"));
// write the transformed result XmlTextWriter writer = new XmlTextWriter(Server.MapPath("result.xml"), null);
// do the actual transform of Xml // pass XmlResolver to Transform() method myXslTrans.Transform(myXPathDoc, null, writer, null); writer.Close();
XML file
<?xml version="1.0" encoding="utf-8"?>
<Documents> <Document chapter="1" title="title 1" href="file1.xml" filter=""> <Article title="1.1" info="sub" filter="food"/> <Article title="1.2" info="main" filter="food"/> </Document> <Document chapter="2" title="title 2" href="file2.xml" filter="drink"> <Article title="2.1" info="sub" filter="drink"/> <Article title="2.2" info="main" filter="food"/> </Document> </Documents>
XSLT stylesheet
<?xml version='1.0' encoding='UTF-8'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- using muenchian method group by an attribute by asigning a unique key to each element -->
<xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
<!-- xsl:key name="by-proctype" match="Doc" use="@proceduretype"/ -->
<!-- define info key --> <xsl:key name="by-info" match="Article" use="@info"/>
<!-- put the filter string in a global parameter --> <xsl:param name="filter" select="'food'"/>
<xsl:template match="Documents"><!-- @filter='' will be true if it is there and empty or if it is not there at all) -->
<documents> <xsl:for-each select="Document[@filter='' or @filter=$filter]/Article[count(.|key('by-info',@info)[@filter='' or @filter=$filter][1])=1]"> <document name="{@info}"><xsl:copy-of select="key('by-info',@info)[@filter=$filter]"/></document> </xsl:for-each> </documents> </xsl:template>
</xsl:stylesheet>
Exception Details:
System.NullReferenceException: Object reference not set to an instance of an object."
Stack Trace:
[NullReferenceException: Object reference not set to an instance of an object.] System.Xml.XPath.FilterQuery.SetXsltContext(XsltCo ntext input) System.Xml.XPath.FilterQuery.SetXsltContext(XsltCo ntext input) System.Xml.XPath.MergeFilterQuery.SetXsltContext(X sltContext input) System.Xml.XPath.OrQuery.SetXsltContext(XsltContex t context) System.Xml.XPath.MethodOperand.SetXsltContext(Xslt Context context) System.Xml.XPath.LogicalExpr.SetXsltContext(XsltCo ntext context) System.Xml.XPath.FilterQuery.SetXsltContext(XsltCo ntext input) System.Xml.XPath.MergeFilterQuery.SetXsltContext(X sltContext input) System.Xml.XPath.CompiledXpathExpr.SetContext(XmlN amespaceManager nsManager) System.Xml.Xsl.Processor.GetCompiledQuery(Int32 key) System.Xml.Xsl.Processor.StartQuery(XPathNavigator context, Int32 key) System.Xml.Xsl.ForEachAction.Execute(Processor processor, ActionFrame frame) System.Xml.Xsl.ActionFrame.Execute(Processor processor) System.Xml.Xsl.Processor.Execute() System.Xml.Xsl.XslTransform.Transform(XPathNavigat or input, XsltArgumentList args, XmlWriter output, XmlResolver resolver) System.Xml.Xsl.XslTransform.Transform(IXPathNaviga ble input, XsltArgumentList args, XmlWriter output, XmlResolver resolver) com.pop.mm_main_v2.Page_Load(Object sender, EventArgs e) in c:\inetpub\wwwroot\file\index.aspx.cs:61 .....
When I use XMLSpy to parse the XML using MSXML 4 processor it works perfect. Saxon works perfectly as well. But when I try to parse it trough C#, I get the error above.
It looks like I don't use MSXML 4 at all.
How do I make sure that MSXML 4 is used when I parse? Thank you,
-Mike
Michael wrote: I have figured out that this is a parser issue. My IE is using version 3.0 set as default in registry.
IE always using MSXML3. The on;y way to use MSXML4 is scripting.
--
Oleg Tkachenko [XML MVP] http://blog.tkachenko.com
I do not manage to add new message to the list (I must choose a discussion
group but the list is empty !) so I put my post hier as reply... It's also a
kind of MSXSL bug.
I'd just like to spécify a probable "exeption" in SelectSingleNode() method.
The spec says :
"var objXMLDOMNode = oXMLDOMNode.selectSingleNode(queryString);
Where queryString is a string specifying an XPath expression."
But if you for example aim at matching the SECOND <foo> node of a context
node, you must write selectSingleNode(foo[1])
the FIRST one is selectSingleNode(foo[0])
Normaly, Xpath index position start at 1 (foo[1] is the short for
foo[position()=1]) :
<xsl:value-of select="foo[1]"> will match the FISRT foo node in XSL.
About the SelectSingleNode() spec queryString is not a real XPath
expression, because of this exeption (maybe there are others ?), isn't it ?
I did not manage to add a new message (I shall choose a discussion group but
the list is empty !) so I send it here as reply since it's also a kind of
Msxsml bug...
I'd just like to spécify a probable "exeption" in SelectSingleNode() method.
The spec says :
"var objXMLDOMNode = oXMLDOMNode.selectSingleNode(queryString);
Where queryString is a string specifying an XPath expression."
But if you for example aim at matching the SECOND <foo> node of a context
node, you must write selectSingleNode(foo[1])
the FIRST one is selectSingleNode(foo[0])
Normaly, Xpath index position start at 1 (foo[1] is the short for
foo[position()=1]) :
<xsl:value-of select="foo[1]"> will match the FISRT foo node in XSL.
About the SelectSingleNode() spec queryString is not a real XPath
expression, because of this exeption (maybe there are others ?), isn't it ?
mattmat wrote: I'd just like to spécify a probable "exeption" in SelectSingleNode() method. The spec says : "var objXMLDOMNode = oXMLDOMNode.selectSingleNode(queryString); Where queryString is a string specifying an XPath expression."
But if you for example aim at matching the SECOND <foo> node of a context node, you must write selectSingleNode(foo[1]) the FIRST one is selectSingleNode(foo[0])
Well, chances are you are using MSXML3, where selection language by
default isn't XPath, but some obsoleted language called XSL Pattern. I
have no idea which number position starts in that language.
Set XPath as selection language using SelectionLanguage property.
PS. And it has nothing to do with .NET of course.
--
Oleg Tkachenko [XML MVP] http://blog.tkachenko.com This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
by: Alastair Cameron |
last post by:
I have a VB (VB6, not .NET) application that reads an XML file (using MSXML
v3.2 parser); the XML file contains a reference to an external DTD.
The DTD has numerous enumerated attribute...
|
by: OKI |
last post by:
Hi.
I´ve made a XML parser using MSXML2.LIB in a computer. When i´ve tried
to run it in another one like that:
HRESULT hr = CoCreateInstance(CLSID_DOMDocument, NULL,
CLSCTX_INPROC_SERVER,...
|
by: Bill Cunningham |
last post by:
For some reason I can't find on my win98 IE5 or 5.5 the msxml2.5 parser
that's supposed to be there. Does anyone know where I can get one?
Also if I was running my linux system. Where could I get...
|
by: Olav |
last post by:
I have an element that looks like this:
<PhoneNumber><NUMBER></PhoneNumber>
I would like to have the content returned as "<NUMBER>".
Not only don't I get the character references resolved,...
|
by: Mark Miller |
last post by:
QUESTION:
Does anyone know how I can use v2.6 of the MSXML parser with .NET?
BACKGROUND:
I "Web to Print" process that allows our clients (newspapers) to export
their data and pass it thru a...
|
by: JohnArgost |
last post by:
I try to learn how to parser XML files. Should I learn MSXML or .NET
(system.xml) or both. Is MSXML an old technology which is replaced by .NET?
Thanks in advance.
|
by: K |
last post by:
I've an XML file in UTF-8.
It contains some chinese characters ( both simplified chinese and
traditional chinese).
In loading the XML file with MSXML parser, I used the below code to retrieve...
|
by: yawnmoth |
last post by:
<http://www.quirksmode.org/book/printable/xmlhttp.txtshows two
alternatives to Microsoft.XMLHTTP - Msxml2.XMLHTTP and Msxml3.XMLHTTP.
If my understanding is correct, the different numbers refer to...
|
by: JJA |
last post by:
I'm working on part of a site (see http://gis.cbmiweb.com/MDWmaps/default.asp)
where I thought everything was working fine for IE6, IE7 and Firefox.
Recently, I discovered this failed for an IE7...
|
by: lllomh |
last post by:
Define the method first
this.state = {
buttonBackgroundColor: 'green',
isBlinking: false, // A new status is added to identify whether the button is blinking or not
}
autoStart=()=>{
|
by: DJRhino |
last post by:
Was curious if anyone else was having this same issue or not....
I was just Up/Down graded to windows 11 and now my access combo boxes are not acting right. With win 10 I could start typing...
|
by: isladogs |
last post by:
The next Access Europe meeting will be on Wednesday 4 Oct 2023 starting at 18:00 UK time (6PM UTC+1) and finishing at about 19:15 (7.15PM)
The start time is equivalent to 19:00 (7PM) in Central...
|
by: tracyyun |
last post by:
Hello everyone,
I have a question and would like some advice on network connectivity. I have one computer connected to my router via WiFi, but I have two other computers that I want to be able to...
|
by: giovanniandrean |
last post by:
The energy model is structured as follows and uses excel sheets to give input data:
1-Utility.py contains all the functions needed to calculate the variables and other minor things (mentions...
|
by: NeoPa |
last post by:
Introduction
For this article I'll be using a very simple database which has Form (clsForm) & Report (clsReport) classes that simply handle making the calling Form invisible until the Form, or all...
|
by: Teri B |
last post by:
Hi, I have created a sub-form Roles. In my course form the user selects the roles assigned to the course.
0ne-to-many. One course many roles.
Then I created a report based on the Course form and...
|
by: NeoPa |
last post by:
Introduction
For this article I'll be focusing on the Report (clsReport) class. This simply handles making the calling Form invisible until all of the Reports opened by it have been closed, when it...
|
by: isladogs |
last post by:
The next online meeting of the Access Europe User Group will be on Wednesday 6 Dec 2023 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM).
In this month's session, Mike...
| |