2010-09-03 3 views
1

Je suis nouveau en C++ et j'ai hérité du code suivant qui est censé transformer le XML donné en utilisant le fichier XSLT pour simplement cracher les valeurs de texte.La transformation XLST C++ ne fonctionne pas avec MSXML 3.0

Il charge à la fois le code XML et XSLT et l'appel transformnode() renvoie le succès, mais aucune transformation n'a été appliquée. La sortie d'origine en bas contient le code XML d'origine intact.

Il utilise MSXML 3.0. J'ai utilisé Xselerator pour valider que le XSLT est valide et fonctionne (c'est-à-dire que la chaîne "Ceci est un message de test .." est renvoyée).

Voici le code (moins toute la gestion des erreurs):

IXMLDOMNode *m_pXslt; 

ESSXsltData::Initialise(void) 
{ 
    IUnknown *l_pUnknown = NULL; 
    IXMLDOMDocument *l_pXSLDocument = NULL; 

HRESULT hr = CoCreateInstance(__uuidof(DOMDocument), NULL, CLSCTX_ALL, IID_IUnknown, (LPVOID *)&l_pUnknown); 
hr = l_pUnknown->QueryInterface(IID_IXMLDOMDocument,(LPVOID *)&l_pXSLDocument); 
CString l_sFileName(RetrieveXsltFileName().c_str()); 
hr = l_pXSLDocument->load(l_vFileName, &l_bSuccess); 

hr = l_pXSLDocument->QueryInterface(IID_IXMLDOMNode, (LPVOID *)(&m_pXslt)); 
} 

HRESULT ESSXsltData::ApplyXslt(const char *p_pszESSXml, std::vector<std::string> &p_CommentLines) 
{ 
    IUnknown *l_pUnknown = NULL; 
    IXMLDOMDocument *l_pDocument = NULL; 


if (p_pszESSXml) 
{ 
    VARIANT_BOOL l_bSuccess; 
    HRESULT hr = CoCreateInstance(__uuidof(DOMDocument), NULL, CLSCTX_ALL, IID_IUnknown, (LPVOID *)&l_pUnknown); 
    hr = l_pUnknown->QueryInterface(IID_IXMLDOMDocument,(LPVOID *)&l_pDocument); 

    hr = l_pDocument->loadXML(CComBSTR(p_pszESSXml) , &l_bSuccess); 
    hr = l_pDocument->QueryInterface(IID_IXMLDOMNode, (LPVOID *)(&m_pXslt)); 

    BSTR l_bsOutput = NULL; 
    hr = l_pDocument->transformNode(m_pXslt, &l_bsOutput); 

    COLE2T l_AsciiOutput(l_bsOutput); 
    log << "AsciiOutput: " << l_AsciiOutput << "\n"; 
} 
} 

La chaîne p_pszESSXml est:

<ESS><Message>This is a test message...</Message></ESS> 

Le XSLT est:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
    <xsl:output method="text" indent="yes"/> 
    <xsl:template match="ESS"> 
     <xsl:apply-templates select="Message"/> 
    </xsl:template> 
    <xsl:template match="Message"> 
     <xsl:value-of select="."/> 
    </xsl:template> 
</xsl:stylesheet> 

Répondre

0

le fixe.

Il réaffectait m_pXslt pour égaler le XML qu'il était censé valider.

Quelqu'un a copié et collé.