XML : Can't get xsl:import or xsl:include to work on MSXML6

I am trying to get MSXML6 XSLT import (or include) functionality working for my app. I have looked everywhere for a solution to this and have found a number of references to people for whom it seems to be working so I'm thinking I must be doing something wrong but I can't figure out what it is.

Book.xml

  <Book>      <Title>A Christmas Carol</Title>      <Author>Charles Dickens</Author>      <Binding>Hardcover</Binding>      <Price>14.99</Price>      <Comment/>  </Book>    

DefaultRules.xsl

  <xsl:stylesheet version="1.0"       xmlns:xsl="http://www.w3.org/1999/XSL/Transform">      <xsl:include href="/Temp/Book.xsl"/>      <xsl:output method="text" indent="no"/>        <xsl:template match="/">          <xsl:apply-templates select="Book"/>      </xsl:template>  </xsl:stylesheet>    

Book.xsl

  <xsl:stylesheet version="1.0"      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">      <xsl:template match="Book">          <xsl:text>Title: </xsl:text>          <xsl:apply-templates select="Title"/>          <xsl:text>&#10;</xsl:text>          <xsl:apply-templates select="Author"/>          <xsl:text> - $</xsl:text>          <xsl:apply-templates select="Price"/>      </xsl:template>  </xsl:stylesheet>    

Proto.cpp

  int _tmain(int argc, _TCHAR* argv[])  {      CoInitialize(NULL);        variant_t vResult;      LPCTSTR output = NULL;      MSXML2::IXMLDOMDocumentPtr pXml(__uuidof(MSXML2::DOMDocument60));      MSXML2::IXMLDOMDocumentPtr pXslt(__uuidof(MSXML2::FreeThreadedDOMDocument60));      MSXML2::IXSLTemplatePtr pTemplate(__uuidof(MSXML2::XSLTemplate60));      MSXML2::IXSLProcessorPtr pProcessor;      IStream *pOutStream;      // load xml file with data and xsl file to transform      // xml -> html      pXml->async = false;      pXml->load(_bstr_t("Book.xml"));      pXslt->resolveExternals = true;      pXslt->async = false;      pXslt->load(_bstr_t("/Temp/DefaultRules.xsl"));      pTemplate->stylesheet = pXslt;      pProcessor = pTemplate->createProcessor();        CreateStreamOnHGlobal(NULL, TRUE, &pOutStream);      pProcessor->put_output(_variant_t(pOutStream));      pProcessor->put_input(_variant_t((IUnknown*)pXml));      pProcessor->transform();      //get results of transformation and print them to stdout      HGLOBAL hg = NULL;      pOutStream->Write((void const*)"\0\0", 2, 0);      GetHGlobalFromStream(pOutStream, &hg);      output = (LPCTSTR)GlobalLock(hg);      wprintf(L"%s", output);      GlobalUnlock(hg);        //release before CoUninitialize()      pXml.Release();      pXslt.Release();      pTemplate.Release();      pProcessor.Release();        CoUninitialize();      getchar();      return 0;  }    

The (correct) output I get from an XML tool (EditiX) is

  Title: A Christmas Carol  Charles Dickens - $14.99    

The (incorrect) output that I get from MSXML6 transform is

  A Christmas CarolCharles DickensHardcover14.99    

It looks like the file specified for inclusion isn't being imported/included so I'm just getting the default template results although I don't get any error messages. As you can see, I am setting the resolveExternals flag to true (new for MSXML6). I have also tried loading it from the current folder as well as a specific folder (the above code uses /Temp). I have also tried using both xsl:import and xsl:include. The solution always works in the XML tool but always gives the incorrect result using the above code and MSXML6. I am using Windows 10 if that could be related.

No comments:

Post a Comment