Задача Xslt не работает должным образом

У меня есть преобразование XSLT, которое я разработал в VS. Он отлично работает, когда я использую VS для его запуска (через XML-> Показать вывод Xslt). Однако, когда я выполняю его через Xslt-задачу MsBuildCommunityTasks, я получаю совершенно разные результаты.

В частности, вывод представляет собой содержимое нескольких элементов, на которые я даже не ссылаюсь в своем 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 использует внутри? Любое руководство будет оценено.


person Josh Buedel    schedule 06.11.2009    source источник
comment
Без некоторого ввода, xslt, правильного вывода и неправильного вывода отлаживать довольно сложно.   -  person Jim Garrison    schedule 06.11.2009


Ответы (3)


У меня тоже были проблемы с запуском <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"
  />

У меня сработало с первого раза! Спасибо Брайану Куку на городском кануке, а предоставление хорошего обзора параметров XSLT в MSBuild

person Jim Counts    schedule 23.02.2012

Я также потратил некоторое время на то, чтобы заставить эту 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;
}
person Bart Janson    schedule 23.11.2009

RootTag применяется до преобразования, а не после него. Учитывайте RootTag при написании xslt, и он будет работать.

person Marius    schedule 28.04.2015