Объединение нескольких файлов XML с различными структурами узлов с использованием XSLT в C # - PullRequest
0 голосов
/ 10 мая 2018

У меня проблемы со слиянием нескольких файлов с использованием XSL-трансформации в C #. Я последовал нескольким примерам и сообщениям с севреальских сайтов, и я так близко, но не радуюсь. Я получаю сообщение об ошибке при выполнении кода, заявляющего "Узлы пространства имен не могут быть добавлены к родительскому элементу после того, как узел атрибута уже был добавлен." .

Вот мой код

string[] filesInCurrentDir = Directory.GetFiles(dirsWithTestCases[a], "*.xml");
string[] xslFilePath = Directory.GetFiles(dirsWithTestCases[a], "*.xsl");
string[] outputPathArray = Directory.GetFiles(dirsWithTestCases[a] + "\\Expected");
var resolver = new XmlPreloadedResolver();
var inputPath = string.Empty;    
for (int x = 0; x < filesInCurrentDir.Length; x++)
{
    if (filesInCurrentDir[x].IndexOf(".xml") > 0)
    {
        // First file load into doc variable
        if (inputPath == string.Empty)
        {
            // Load the first XML file into a document
            //input.LoadXml(filesInCurrentDir[x]);
            inputPath = filesInCurrentDir[x];
        }
        //Any and all other files
        else
        {
            var files = new FileInfo(filesInCurrentDir[x]);
            var inputStream = files.OpenRead();
            resolver.Add(new Uri(filesInCurrentDir[x]), inputStream);
        }
    }
}
// Load the XSL
var xslt = new XslCompiledTransform(true);
var xlstFile = new FileInfo(xslFilePath[0]);
var xsltDoc = new XmlDocument();
// Load the XSLT file through XmlReader to override the base URI.
using (StreamReader reader = File.OpenText(xslFilePath[0]))
using (XmlReader xmlReader = XmlReader.Create(reader, null, xslFilePath[0]))
{
    xsltDoc.Load(xmlReader);
}
// Use XsltSettings to enable the use of the document() function.
xslt.Load(xsltDoc, new XsltSettings(true, false), null);

// Define the output
var output = new FileInfo(outputPathArray[0] + ".UPDATED");

// Create input stream for first file
var inputFile = new FileInfo(inputPath);
//var inputStream = inputFile.OpenRead();
var input = new XmlDocument();
input.Load(inputPath);

// Compile stylesheet
var processor = new Processor();
var compiler = processor.NewXsltCompiler();
var executable = compiler.Compile(new Uri(xlstFile.FullName));

using (StringWriter OutputWriter = new StringWriter())
using (XmlWriter xmlWriter = XmlWriter.Create(OutputWriter))
{
    // Pass the resolver to the transform

    XmlWriterSettings settings = new XmlWriterSettings
    {
        Indent = true
    };
    var inputUri = new Uri(inputPath);
    xslt.Transform(input, xmlWriter);
}

Ошибка в этой строке

xslt.Transform(input, xmlWriter);

Ошибка:

"Узлы пространства имен нельзя добавить к родительскому элементу после того, как узел атрибута уже был добавлен."

трассировка стека

at System.Xml.Xsl.Runtime.XmlQueryOutput.StartCopy(XPathNavigator navigator, Boolean callChk)
at System.Xml.Xsl.Runtime.XmlQueryOutput.CopyNode(XPathNavigator navigator)
at System.Xml.Xsl.Runtime.XmlQueryOutput.WriteItem(XPathItem item)
at System.Xml.Xsl.CompiledQuery.Query.<xsl:template match="*" mode="elaborate">(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime, XPathNavigator {urn:schemas-microsoft-com:xslt-debug}current, Double {urn:schemas-microsoft-com:xslt-debug}position, Double {urn:schemas-microsoft-com:xslt-debug}last, IList`1 {urn:schemas-microsoft-com:xslt-debug}namespaces)
at System.Xml.Xsl.CompiledQuery.Query.<xsl:apply-templates mode="elaborate">(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime, XPathNavigator , Double , Double )
at System.Xml.Xsl.CompiledQuery.Query.<xsl:template match="*" mode="elaborate">(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime, XPathNavigator {urn:schemas-microsoft-com:xslt-debug}current, Double {urn:schemas-microsoft-com:xslt-debug}position, Double {urn:schemas-microsoft-com:xslt-debug}last, IList`1 {urn:schemas-microsoft-com:xslt-debug}namespaces)
at System.Xml.Xsl.CompiledQuery.Query.<xsl:apply-templates mode="elaborate">(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime, XPathNavigator , Double , Double )
at System.Xml.Xsl.CompiledQuery.Query.__ARR_AddPassengerInfoToBooking(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime) in :line 0
at System.Xml.Xsl.CompiledQuery.Query.Execute(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime)
at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlSequenceWriter results)
at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlWriter writer)
at System.Xml.Xsl.XslCompiledTransform.Transform(IXPathNavigable input, XsltArgumentList arguments, XmlWriter results, XmlResolver documentResolver)
at System.Xml.Xsl.XslCompiledTransform.Transform(IXPathNavigable input, XmlWriter results)
at XSLTRegressionSuite.Program.Main(String[] args) in \XSLT.Regression.Suite\XSLTRegressionSuite\Program.cs:line 245

Любая помощь очень ценится.

Приветствия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...