xml - 无法获取 xsl :import or xsl:include to work on MSXML6

标签 xml xslt msxml6

我正在尝试让 MSXML6 XSLT 导入(或包含)功能适用于我的应用程序。我到处寻找解决方案,并找到了许多对它似乎有效的人的引用,所以我想我一定做错了什么,但我不知道它是什么。

Book.xml

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

默认规则.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>

书.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>

原型(prototype).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;
}

我从 XML 工具 (EditiX) 获得的(正确)输出是

Title: A Christmas Carol
Charles Dickens - $14.99

我从 MSXML6 转换获得的(不正确的)输出是

A Christmas CarolCharles DickensHardcover14.99

看起来指定包含的文件没有被导入/包含,所以我只是得到默认的模板结果,尽管我没有收到任何错误消息。正如您所看到的,我将resolveExternals 标志设置为true(MSXML6 的新增功能)。我还尝试从当前文件夹以及特定文件夹加载它(上面的代码使用/Temp)。我还尝试使用 xsl:import 和 xsl:include。该解决方案始终在 XML 工具中有效,但使用上述代码和 MSXML6 总是给出错误的结果。我正在使用 Windows 10(如果这可能相关的话)。

最佳答案

我认为问题在于您设置了pXslt->resolveExternals = true;,您需要使用pXslt->resolveExternals = VARIANT_TRUE;

关于xml - 无法获取 xsl :import or xsl:include to work on MSXML6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34728538/

相关文章:

java - 使用 DocumentBuilderFactory 将 Xml 文档转换为 DOM 对象

python - 使用 python reshape xml?

excel - XPath 在带有 DOMDocument 的 Excel VBA 中无法正常工作

xml - 在 XSLT 1.0 中用前导零填充数字

delphi - 如何在 Delphi 中使用 MSXML SAX 组合大型 XML 文件

xml - 带有 SSL IO 错误的 Django 请求 XML 文件

android - 将 imageView 中的图像与底部中心对齐

xslt - 从 Sitecore 中的 Xslt 辅助函数类修改页面控件

performance - .net 中的 XSLT 转换性能

php - 与 XPath 等效的 Mysql like 子句