1

我有一个在 VS 中开发的 XSLT 转换。当我使用 VS 运行它(通过 XML->Show Xslt 输出)时,它工作得很好。但是,当我通过 MsBuildCommunityTasks Xslt 任务执行它时,我得到了截然不同的结果。

具体来说,输出只是我在 XSLT 中没有引用的少数元素的内容。我想默认的转换正在拾取它们。

我的任务声明再简单不过了:

<Xslt 
  Inputs="BuildLo​gs\partcover-result​s.xml" 
  Xsl="ExtTools\​xslt\partcover.asse​mbly.report.xsl​" 
  RootTag="" 
  RootAttributes="" 
  Output="partcov​er.assembly.report.h​tml" 
/>

也许 msbuildtasks 使用的 XSLT 引擎与 VS 内部使用的不同?任何指导将不胜感激。

4

3 回答 3

2

我也很难<Xslt />去上班。从 .NET 4.0 开始,内置了 XmlTransformation 任务。这是您的示例的外观:

  <XslTransformation 
   OutputPaths="partcov​er.assembly.report.h​tml" 
   XmlInputPaths="BuildLo​gs\partcover-result​s.xml"
   XslInputPath="ExtTools\​xslt\partcover.asse​mbly.report.xsl"
  />

第一次为我工作!感谢城市 canuk 的Bryan Cook ,嗯,他很好地概述了 MSBuild 中的 XSLT 选项

于 2012-02-23T15:35:33.343 回答
0

我还花了一些时间试图让这个 Xslt 任务工作,摆弄 RootTag 和属性。大约 2 小时后,我放弃了,而是编写了自己的任务来完成这项工作,这在我的第一次尝试中就奏效了。

public override bool Execute()
{
    bool result = true;

    Log.LogMessage("Transforming from {0} to {1} using {2}",
        XmlFile, OutputFile, XsltFile);

    XmlWriter xmlWriter = null;

    try
    {
        XslCompiledTransform xslTransform = GetXslTransform(XsltFile);
        XmlReader xmlReader = GetXmlReader(XmlFile);
        xmlWriter = GetXmlWriter(OutputFile);
        xslTransform.Transform(xmlReader, xmlWriter);
    }
    catch (Exception e)
    {
        Log.LogErrorFromException(e);
        result = false;
    }
    finally
    {
        if (xmlWriter != null)
        {
            xmlWriter.Flush();
            xmlWriter.Close();
        }
    }

    return result;
}
于 2009-11-23T14:56:40.080 回答
0

RootTag在转换运行之前应用,而不是之后。在编写 xslt 时考虑 RootTag,它会起作用

于 2015-04-28T16:01:57.247 回答